WebSocket数据包协议详解
smark
https://github.com/IKende/

WebSocket数据包协议详解

其实我一直想不明白HTML5包装个应用层办议作为Socket通过基础目的是为了什么,其实直接支持Socket tcp相对来说更加简单灵活.既然标准已经制定而浏览器也支持那对于我们开发者来说只能用的分.最新版本的WebSocket协议于2011-12其标准规范已经明确下来,所以现在可以根据这标准进行相应的开发.详细参考http://datatracker.ietf.org/doc/rfc6455/?include_text=1

WebSocket协议主要分为两部分,第一部分是连接许可验证和验证后的数据交互.连接许可验证比较简单,由Client发送一个类似于HTTP的请求,服务端获取请求后根据请求的KEY生成对应的值并返回.

连接请求内容:
GET / HTTP/1.1
Connection:Upgrade
Host:127.0.0.1:8088
Origin:null
Sec-WebSocket-Extensions:x-webkit-deflate-frame
Sec-WebSocket-Key:puVOuWb7rel6z2AVZBKnfw==
Sec-WebSocket-Version:13
Upgrade:websocket
服务端接收请求后主要是成针对Sec-WebSocket-Key生成对就Sec-WebSocket-Accept 的key,生成Sec-WebSocket-Accept 值比较简单就是Sha1(Sec-WebSocket-Key+258EAFA5-E914-47DA-95CA-C5AB0DC85B11)即可,C#代码如下:
SHA1 sha1 = new SHA1CryptoServiceProvider();
byte[] bytes_sha1_in = Encoding.UTF8.GetBytes(request.SecWebSocketKey+ "258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
byte[] bytes_sha1_out = sha1.ComputeHash(bytes_sha1_in);
string str_sha1_out = Convert.ToBase64String(bytes_sha1_out);
response.SecWebSocketAccept = str_sha1_out;
服务端返回内容:
HTTP/1.1 101 Switching Protocols
Connection:Upgrade
Server:beetle websocket server
Upgrade:WebSocket
Date:Mon, 26 Nov 2012 23:42:44 GMT
Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:content-type
Sec-WebSocket-Accept:FCKgUr8c7OsDsLFeJTWrJw6WO8Q=
经过服务器的返回处理后连接握手成功,后面就可以进行TCP通讯.WebSocket在握手后发送数据并象下层TCP协议那样由用户自定义,还是需要遵循对应的应用协议规范...这也是在文章之说没有直接基于Socket tcp方便的原因.

数据交互协议:
这图有点难看懂...里面包括几种情况有掩码,数据长度小于126,小于UINT16和小于UINT64等几种情况.后面会慢慢详细说明.整个协议头大概分三部分组成,第一部分是描述消息结束情况和类型,第二部分是描述是否存在掩码长度,第三部分是扩展长度描述和掩码值.

从图中可以看到WebSocket协议数据主要通过头两个字节来描述数据包的情况

第一个字节

最高位用于描述消息是否结束,如果为1则该消息为消息尾部,如果为零则还有后续数据包;后面3位是用于扩展定义的,如果没有扩展约定的情况则必须为0.可以通过以下c#代码方式得到相应值
mDataPackage.IsEof = (data[start] >> 7) > 0;
最低4位用于描述消息类型,消息类型暂定有15种,其中有几种是预留设置.c#代码可以这样得到消息类型:

int type = data[start] & 0xF;
mDataPackage.Type = (PackageType)type;
第二个字节

消息的第二个字节主要用一描述掩码和消息长度,最高位用0或1来描述是否有掩码处理,可以通过以下c#代码方式得到相应值
bool hasMask = (data[start] >>7) > 0;
剩下的后面7位用来描述消息长度,由于7位最多只能描述127所以这个值会代表三种情况,一种是消息内容少于126存储消息长度,如果消息长度少于UINT16的情况此值为126,当消息长度大于UINT16的情况下此值为127;这两种情况的消息长度存储到紧随后面的byte[],分别是UINT16(2位byte)和UINT64(4位byte).可以通过以下c#代码方式得到相应值
mPackageLength = (uint)(data[start] & 0x7F);
start++;
if (mPackageLength == 126)
{
    mPackageLength = BitConverter.ToUInt16(data, start);
    start = start + 2;
}
else if (mPackageLength == 127)
{
    mPackageLength = BitConverter.ToUInt64(data, start);
    start = start + 8;
}
如果存在掩码的情况下获取4位掩码值:
if (hasMask)
{
    mDataPackage.Masking_key = new byte[4];
    Buffer.BlockCopy(data, start, mDataPackage.Masking_key, 0, 4);
          
    start = start + 4;
    count = count - 4;
}
获取消息体

当得到消息体长度后就可以获取对应长度的byte[],有些消息类型是没有长度的如%x8 denotes a connection close.对于Text类型的消息对应的byte[]是相应字符的UTF8编码.获取消息体还有一个需要注意的地方就是掩码,如果存在掩码的情况下接收的byte[]要做如下转换处理:
if (mDataPackage.Masking_key != null)
    {
        int length = mDataPackage.Data.Count;
        for (var i = 0; i < length; i++)
            mDataPackage.Data.Array[i] = (byte)(mDataPackage.Data.Array[i] ^ mDataPackage.Masking_key[i % 4]);
    }

来自:http://www.cnblogs.com/smark/archive/2012/11/26/2789812.html

阅读全文
/*
Warning: Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of getimagesize(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer. ind:\vhost\include\inc_custom_fields.php on line178
*/

我把php.ini的display_errors = on改成display_errors = off // (不显示错误)
就不显示了。

虽然没有什么影响。但是心里还是有个疙瘩。。。
百度上没有找到什么答案,然后在google上 找到了。

修改php.ini就可以了。

1. 在PHP.ini中搜索关键字 : allow_call_time_pass_reference 没有的自行建立。
2. 将 Off 改成 On ,Web Server重起就OK了~
allow_call_time_pass_reference = Off 变成 allow_call_time_pass_reference = On


ps

文档注解为:

是否启用在函数调用时强制参数被按照引用传递。此方法已不被赞成并在 PHP/Zend 未来的版本中很可能不再支持。鼓励使用的方法是在函数定义中指定哪些参数应该用引用传递。鼓励大家尝试关闭此选项并确保脚本能够正常运行,以确保该脚本也能在未来的版本中运行(每次使用此特性都会收到一条警告,参数会被按值传递而不是按照引用传递)。

在函数调用时通过引用传递参数是不推荐的,因为它影响到了代码的整洁。如果函数的参数没有声明作为引用传递,函数可以通过未写入文档的方法修改其参数。要避免其副作用,最好仅在函数声明时指定那个参数需要通过引用传递。


可以在函数里修改外面变量的值:


这样写就有前面描述的一系列问题:


说白了就是不能传一个地址给一个定义的函数参数里不是地址,这会有问题。
这块特别是在foreach这块的php实现上可能有一点缺陷也好,总之,想抛弃c的&取地址符号是php简单的根源。

执行结果如下:
---------- 调试PHP ----------
Deprecated: Call-time pass-by-reference has been deprecated; If you would like to pass it by reference, modify the declaration of test1().  If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file in D:\wamp\www\array_walk.php on line 11

PHP Deprecated:  Call-time pass-by-reference has been deprecated; If you would like to pass it by reference, modify the declaration of test1().  If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file in D:\wamp\www\array_walk.php on line 11
输出完成 (耗时 0 秒) - 正常终止



像pdo的foreach陷阱和这有关,究其原因, 也就是bindParam和bindValue的不同之处, bindParam要求第二个参数是一个引用变量(reference),引用这种东东在PHP里出现其实怎么说好呢,有它有好处,用不好大大的坏,陷阱的根源,像c不是c的PHP的问题是PHP发展的争议根源,如果多都用c里的特性,那PHP完全可以成为一个类java的常驻内存server,乃至内存实现上也可有进步,但会编写复杂,掌握难度加大:
http://weibo.com/1170999921/ylgFcpe1f
http://www.laruence.com/2012/10/16/2831.html
https://jackxiang.com/post/7425/
背景:tadb.exe好像对豌豆荚的PC运行程序下插入usb的手机识别有些问题...需要对其进行干掉或特殊处理。
方法一:
第一步:首先通过快捷键“Win+R”来打开“运行”菜单。
第二步:输入“gpedit.msc”回车确认,进入我们电脑中的组策略编辑器。
第三步:然后选择“用户配置-管理模板-系统”,双击右侧的“不要运行指定的windows应用程序”。
第四步:在打开的对话框里,选择“已启用”,然后点击“不允许的应用程序的列表”后面“显示”。
第五步:在弹出的“显示内容”的对话框里把想要禁止的程序输入即可。比如把tadb.exe添加进去。


方法二:
QQ---设置---提醒---安卓设备连接提醒(对勾去掉)

方法三:
最好的办法是找到tadb.exe所在的目录,向上一层,直接把那个tadb.exe干掉。
实在不行,直接把那个tadb所在的文件夹清空,改权限,设只读,完事。

方法四:
删掉那个AndroidAssist文件夹之后,右键新建文本文件,改名为“AndroidAssist”,没有扩展名,再给这个文件加个只读属性

方法五:
删掉tadb.exe这个文件,然后创建一个文本文档,改名为tadb.exe(exe为后缀名)

方法六:
C:\Users\Administrator\AppData\Roaming\Tencent\AndroidAssist
找到此文件夹,将其删除,再新建文件夹AndroidAssist,右键设置安全属性,将所有用户对这个文件夹的权限全都设置为“拒绝”
点击在新窗口中浏览此图片
来自:http://blog.sina.com.cn/s/blog_53fe14e10102ecqk.html
背景:swoole有一个Websocket示例,我作为swoole的顾问,群里反映cocos2dx下的websocket长连接,语言是不一样,但websocket是一样的,swoole是支持Websocket的,作下简单实践。
WebSocket的JavaScript例子,一个WebSocket的简单Echo例子:
例子代码来自:http://www.websocket.org/echo.html
上面这个链接可以当作一个websocket的工具调试并使用。

一、当然,得下载swoole服务扩展并安装:
git clone https://github.com/swoole/swoole-src.git
You should add "extension=swoole.so" to php.ini
二、动态服务端代码:
cd /data/codesdev/swoole/
git clone https://github.com/matyhtf/swoole_framework.git
/data/codesdev/swoole/swoole_framework/examples/websocket_server.php


上面是swoole_framework提供的代码,我们就直接运行这个服务端的server侦听9443端口:
php websocket_server.php

三、静态Js代码,通过firefox访问下,当然其他支持websocket的浏览器也可以,这块暂没从swoole_framework里摘,在网上摘的js,后面会补上从哪儿摘来的Url地址:
/data/htdocs/tools.jackxiang.com/websocket.html
vi websocket.html



四、在Firefox或chrome下访问这个支持websocket的Js代码:
WebSocket Test
CONNECTED
SENT: WebSocket rocks
RESPONSE: Server: WebSocket rocks
DISCONNECTED

说明这个php是真支持websocket的,否则不会输入什么就输出什么,得证。

参考:http://www.xyhtml5.com/websocket-javascript-example.html
——后来发现swoole_framework里的example里居然有对这个websocket的php配套的简单测试代码——
后记,其实swoole_framework下提供了和websocket相关的html测试及php客户端测试:
websocket_client.html  websocket_client.php   websocket_server.php
(1)前端:websocket_client.htm

把wss换成ws,wss好像是https的websocket:
//var wsServer = 'wss://127.0.0.1:9443'; //IP也换下
var wsServer = 'ws://119.10.6.23:9443';
访问下:http://tools.jackxiang.com/websocket_client.html
Connected to WebSocket server.
这个实例不如上面复杂,但服务端确实收到消息了:
[2014-08-22 17:16:47]   INFO    new http request. fd=12
[2014-08-22 17:16:47]   INFO    WebSocket connection #12 is connected


(2)后端:websocket_client.php 这里可能要结合swoole_framework的类java包机制:

修改9503修改为9443,运行测试下:
[root@jackxiang examples]# php  websocket_client.php  
Received from server: Server: hello world
Received from server: Server: hello world
Received from server: Server: hello world
Received from server: Server: hello world
Received from server: Server: hello world
Received from server: Server: hello world
Received from server: Server: hello world
^C
得证。
背景:这块企业QQ也用到PHP的扩展实现Server以供高性能,同时利用PHP的编码效率高、调试快、修改快、迭代快、门槛低实现企业级应用,实为罕见,目前除开QQ有这样的架构外,Swoole也有这样的能力,通过纯C实现了一个PHP的Server扩展,达到很高的长连接数,并且开发入门低、开源、稳定可靠,可以值得从swoole窥探企业QQ的PHPServer的中间层实现,异曲同工之处,值得深入玩味。:-)
对比IaaS和PaaS,SaaS得到的关注显然要少一些。究其根本,不仅因为SaaS关注的是功能方面的探索,更偏向于某个领域或层面的实际应用,还归结于相较前两者,软件的云化已基本趋于成熟,些许突破并不能带来产业上的变革。然而,较少的关注并不意味着缺乏明星产品:放眼国外,企业级SaaS服务已成为许多公司的一项重要收益来源,比如Salesforce、Oracle;而聚焦国内,同样有很多值得我们关注的产品,就比如本次我们关注的焦点——腾讯企业QQ。这里,我们接触到了企业QQ的Web技术团队,与他们团队的王帅、甘德建、赵凯、陈胜强、唐朝等几位核心人员进行了深入沟通,了解了基于LNMP,超过4万付费企业办公平台的架构及优化经验。由王帅代表团队回答。
阅读全文
转至 http://blog.netzhou.net/?p=93

基本上用了mysql作为oltp业务的,基本上都会配置mysql的主从,一方面用mysql的主从做数据库的读写分离,另一方面mysql本身的单机备份不是很强,一般采用主从架构,在从上进行数据备份。
在这过程中或多或少出现一些主从不同步的情况,本文将对数据主从不同步的情况进行简单的总结,在看这篇文章请注意了本文主要从数据库层面上探讨数据库的主从不一致的情况,并不对主从的本身数据不一致引起的主从不同步进行说明:
1.网络的延迟
由于mysql主从复制是基于binlog的一种异步复制,通过网络传送binlog文件,理所当然网络延迟是主从不同步的绝大多数的原因,特别是跨机房的数据同步出现这种几率非常的大,所以做读写分离,注意从业务层进行前期设计。
2.主从两台机器的负载不一致
由于mysql主从复制是主上面启动1个io线程,而从上面启动1个sql线程和1个io线程,当中任何一台机器的负载很高,忙不过来,导致其中的任何一个线程出现资源不足,都将出现主从不一致的情况。
3.max_allowed_packet设置不一致
主上面设置的max_allowed_packet比从大,当一个大的sql语句,能在主上面执行完毕,从上面设置过小,无法执行,导致的主从不一致。
4.key自增键开始的键值跟自增步长设置不一致引起的主从不一致。
5.mysql异常宕机情况下,如果未设置sync_binlog=1或者innodb_flush_log_at_trx_commit=1很有可能出现binlog或者relaylog文件出现损坏,导致主从不一致。
6.mysql本身的bug引起的主从不同步。
7.版本不一致,特别是高版本是主,低版本为从的情况下,主上面支持的功能,从上面不支持该功能。
以上是我遇到的一些主从不同步的情况。或许还有其他的一些不同步的情况,请说出你所遇到的主从不一致的情况。
基于以上情况,先保证max_allowed_packet,自增键开始点和增长点设置一致,再者牺牲部分性能在主上面开启sync_binlog,对于采用innodb的库,推荐配置下面的内容
innodb_flush_logs_at_trx_commit = 1
innodb-support_xa = 1 # Mysql 5.0 以上
innodb_safe_binlog      # Mysql 4.0

同时在从上面推荐加入下面两个参数
skip_slave_start
read_only
[图]如何安装树莓派摄像头模块 ---可以用来作监控,把图发到网上通过http协议--jackxiang。
树莓派摄像头模块(Pi Cam)发售于2013年5月。其第一个发布版本配备了500万像素的传感器,通过排线链接树莓派上的CSI接口。而Pi Cam的第二个发布版本——也被叫做Pi NoIR中,配备了相同的传感器,但没有红外线过滤装置。因此第二版的摄像头模块就像安全监控摄像机一样,可以观测到近红外线的波长(700 - 1000 nm),不过当然同时也就牺牲了一定的显色性。
阅读全文
背景:
一)近来Firefox升级后,其原来Fiddle2的插件没有了,不知是没安上还是版本问题,反正是没有了,尽管Fiddler2原理就是代理可以用AutoProxy插件代替,但是没有那个Firefox下的FiddlerHook插件还真是感觉麻烦,于是想到了这个导入导出插件的办法,将原来的插件导出后在新的Firefox里安装上的一个想法,没有对FiddlerHook作实际导入,只是作了下导出,先作下记录如下:
二)选择Built for .NET 4的fiddler4,也就会安装firefox下的插件,也就是FiddlerHook会在安装fiddler4后,在启动firefox时会提示有插件要安装,位置在D:\Program Files\Fiddler2\FiddlerHook,而fiddler2好像没有firefox插件,同时在firefox的附加组件里也找不到,但是可以找其它firefox的插件替代它,但是没有原装的fiddler4的FiddlerHook插件好用。

一、如何导出?
可用FEBE加CLEO,CLEO不用其实也没什么,只是不太方便。

FEBE下载地址:https://addons.mozilla.org/zh-CN/firefox/addon/febe/
DownLoad ur: https://addons.mozilla.org/firefox/downloads/file/260320/febe-8.0.4-fx.xpi?src=search

CLEO下载地址:https://addons.mozilla.org/zh-CN/firefox/addon/cleo/
DownLoad ur: https://addons.mozilla.org/firefox/downloads/latest/2942/addon-2942-latest.xpi?src=search

你在FEBE选项里-选项-目录,设好目标地址就可以备份了。
在:工具-》FEBE-》执行备份。
      工具-》FEBE-》FEBE选项。
                
经实践:
选快速备份,先选择目录后,可以导出为一个xpi文件。
经实践,发现Firefox直接访问上面的链接地址无法访问,提示https安全问题,后来:
用chrome下载后,再直接拖动到Firefox的扩展里即可安装成功。

Fiddler的FiddlerHook相关信息:
https://jackxiang.com/post/7400/


在默认情况下,Fiddler不能监听Java HttpURLConnection请求。究其原因,Java的网络通信协议栈可能浏览器的通信协议栈略有区别,Fiddler监听Http请求的原理是在应用程序和操作系统网络通信层之间搭建了一个代理服务器,而Java的HttpURLConnection应该是绕过了这个代理服务器,因此Fiddler无法监听到Java HttpURLConnection请求。

解决Fiddler不能监听Java HttpURLConnection请求的基本思路就是设置代理服务器。

Fiddler官网给出的解决办法(见http://www.fiddler2.com/fiddler/help/hookup.asp#Q-JavaTraffic)是设置jvm参数,如

jre -DproxySet=true -DproxyHost=127.0.0.1 -DproxyPort=8888 MyApp
stackoverflow上的牛人们也给出了在Java代码中设置代理服务器的方法(见http://stackoverflow.com/questions/8549749/how-to-capture-https-with-fiddler-in-java),如

System.setProperty("http.proxyHost", "localhost");
System.setProperty("http.proxyPort", "8888");
System.setProperty("https.proxyHost", "localhost");
System.setProperty("https.proxyPort", "8888");
当然最好还是希望Fiddler自身能过增加监听Java HttpURLConnection请求的能力。

来自:http://www.2cto.com/kf/201308/234835.html
给我加上吧,分别对应下,一技术一讲解一文一武:
一)
JACK船长的航海日志——杰克·向: http://jackxiang.com
二)
向东(jack)的博客:  http://jackxiang.com
wp-video Wordpress视频插件
wp-video插件根据shortcode短代码功能制作的视频插件。
介绍
目前支持7大主流视频网站:优酷,土豆,56,搜狐,爱奇艺,腾迅,新浪,PPTV。 对PC和iOS平台均支持。在PC端,播放flash,iOS平台(包括mac电脑)以Html5播放。
对部分网站(优酷,爱奇艺,土豆)支持无广告。这里感谢YoukuAntiADs的修改播放器。

用法
注意:空间必须要支持cUrl
[video width="600" height="500"]http://v.youku.com/v_show/id_XMjU1MDc3Njg0.html[/video]

效果
可以到我的站点查看,作者网站:http://www.idayer.com/my-first-plugin-wp-video.html

历史
v1.0 支持优酷,土豆,56,搜狐,爱奇异,腾迅,新浪。
v1.01  应答大师厨房的要求增加对PPTV视频的支持
v1.1 更新播放器数据,添加插入按钮及插件说明。添加部分网站(优酷,爱奇艺,土豆)支持无广告。

来自:https://github.com/ineo6/wp_video
yum install traceroute -y
阅读全文
背景:我不是双系统,但是启动时有一个选项是ghost如果它是系统,就是双系统,家里电脑没有问题,单位电脑有经常一上班开机后就是黑屏的问题,重新启动多次,或在上电过bios后按esc才能进入,否则就黑屏,在网上查了下有专门软件,先试试。
阅读全文
在进行自动部署的时候,经常需要用脚本获取程序的最新版本号,下面是我的两个解决方案。

for SVN
# 获取XML版本的svn信息,这样可以避免不同语言的问题 __xml=`svn info --xml --incremental` # 我们可以获取到2个版本号,一个是最新版本库版本号,一个是自己的提交版本号。删除自己提交的版本号。 __revision=`echo "$__xml"|sed '/revision/!d'|sed '$d'` # 提取出版本号的数字部分 echo $__revision|sed 's/revision="\([0-9]\+\)">\?/\1/'
# 获取XML版本的svn信息,这样可以避免不同语言的问题
__xml=`svn info --xml --incremental`
# 我们可以获取到2个版本号,一个是最新版本库版本号,一个是自己的提交版本号。删除自己提交的版本号。
__revision=`echo "$__xml"|sed '/revision/!d'|sed '$d'`
# 提取出版本号的数字部分
echo $__revision|sed 's/revision="\([0-9]\+\)">\?/\1/'

for Git
Git采用的是SHA散列码作为版本号,因此它没有顺序的版本号。但我们可以通过统计Git版本库的提交次数来获得一个顺序版本号。

# 基准版本号默认是1,可以通过传递一个参数修改 get_version() { local __base=${1:-1} echo $((`git rev-list --all|wc -l` + $__base)) } get_version 7000
# 基准版本号默认是1,可以通过传递一个参数修改
get_version()
{
    local __base=${1:-1}
    echo $((`git rev-list --all|wc -l` + $__base))
}
get_version 7000

这个版本对网上搜到的那个被普遍转载的版本做了简化和调整。网上那个版本写得比较复杂,例如awk的使用没有必要,而且要统计所有提交,应该用 git rev-list --all 参数,而不是用 git rev-list HEAD。

本文链接:http://zengrong.net/post/1798.htm


Windows 下 Git 客户端的选择,TortoiseGit(乌龟git)保存用户名密码的方法:
windows下比较比较好用的git客户端有2种:

1. msysgit + TortoiseGit(乌龟git)

2. GitHub for Windows

github的windows版也用过一段时间,但还是不太习惯。所以目前仍然青睐与msysgit+乌龟git的组合。TortoiseGit在提交时总数会提示你输入用户名密码,非常麻烦。解决方案如下:

方法一:

设置 -> git 编辑本地 .git/config 增加
[credential]  
    helper = store

保存,输入一次密码后第二次就会记住密码了

方法二:

1. Windows中添加一个HOME环境变量,值为%USERPROFILE%

2. 在“开始>运行”中打开%Home%,新建一个名为“_netrc”的文件

3. 用记事本打开_netrc文件,输入Git服务器名、用户名、密码,并保存:

machine github.com       #git服务器名称
login user          #git帐号
password pwd   #git密码

在windows上建_netrc
copy con _netrc  #创建_netrc文件
#依次输入以下3行:
machine github.com    #git服务器名称
login username        #git帐号
password password     #git密码

在最后一行后输入ctrl+z,文件会自动保存并退出

再次在git上提交时就不用重复输入用户名密码了

来自:http://www.etosun.com/post/130
背景:svn pc客户端项目下的版本号发现其svn log号低于svn update的版本号的情况原因及分析,以及用哪个版本号作为项目发布版本号的最终版本。
经过排查,其原因有二:
1、自己所处项目是处在一个项目集中的一个,根下其它项目(于我同级)地方更新后,我权限不够不知道,用客户端工具也好,终端工具也好都无法看到update的最高版本号(整个根下的最高基线)。
2、update的版本号是全局版本号,而自己项目的svn log则是自己项目的版本号,以它为准才相对靠谱些。
阅读全文
分页: 65/271 第一页 上页 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 下页 最后页 [ 显示模式: 摘要 | 列表 ]