case STAGE_ADDR:
$cmd = ord($buffer[0]);
if($cmd != CMD_CONNECT)
{
echo "bad cmd $cmd\n";
$connection->close();
return;
}
这是 cmd 是协议的
CONNECT 0x01 连接
BIND 0x02 端口监听(也就是在Server上监听一个端口)
UDP ASSOCIATE 0x03 使用UDP
我打印出了$buffer
如下:
0501 0003 1277 7777 2e67 6f6f 676c 6561
7069 732e 636f 6d01 bb
这上面是十六进制的,为什么 要 ord 呢?.ord("01")是 48
$str = '0x01';
echo ord($str);
很疑惑这里啥意思,ord($buffer[1])转换字符串字节为什么是 1....
我感觉我哪块理解错了,字节这方便是薄弱点,大神点拨点拨
接收到的$buffer是二进制串,你打印出来的$buffer是bin2hex()后的16进制串,ord()是获取第一个字符的ASCII编码,而这里的ord是为了配合case逻辑。
难道客户端发过来的就是十六进制的字符串吗?计算机不是通过二进制字符串传输数据的吗?
但是$buffer好像没有经过bin2hex函数,只是一个二进制字符串
0501 0003 1277 7777 2e67 6f6f 676c 6561
7069 732e 636f 6d01 bb
ord是对哪个字符返回的呢,大神
看仔细啊,说了接收到的$buffer是二进制串啊,并没有说接收到的$buffer是经过bin2hex的,比如ord[$buffer[0]]就是对接收到的二进制串中的第一个字节的字符获取对应的ASCII码。
@614:nice,懂了,是二进制串
但是$buffer好像没有经过bin2hex函数,只是一个二进制字符串
上面说了,接收到的$buffer本来就是个二进制串。