workerman socks5 问题

随某人
  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....

2043 3 0
3个回答

随某人

我感觉我哪块理解错了,字节这方便是薄弱点,大神点拨点拨

  • 暂无评论
phpcreeper

接收到的$buffer是二进制串,你打印出来的$buffer是bin2hex()后的16进制串,ord()是获取第一个字符的ASCII编码,而这里的ord是为了配合case逻辑。

  • 随某人 2020-05-13

    难道客户端发过来的就是十六进制的字符串吗?计算机不是通过二进制字符串传输数据的吗?

  • 随某人 2020-05-13

    但是$buffer好像没有经过bin2hex函数,只是一个二进制字符串

  • 随某人 2020-05-13

    0501 0003 1277 7777 2e67 6f6f 676c 6561
    7069 732e 636f 6d01 bb

    ord是对哪个字符返回的呢,大神

  • phpcreeper 2020-05-13

    看仔细啊,说了接收到的$buffer是二进制串啊,并没有说接收到的$buffer是经过bin2hex的,比如ord[$buffer[0]]就是对接收到的二进制串中的第一个字节的字符获取对应的ASCII码。

  • 随某人 2020-05-14

    @614:nice,懂了,是二进制串

随某人

但是$buffer好像没有经过bin2hex函数,只是一个二进制字符串

  • phpcreeper 2020-05-13

    上面说了,接收到的$buffer本来就是个二进制串。

年代过于久远,无法发表回答
×
🔝