WebSockets RFC 6455规范 - 发送数据错误

时间:2012-06-25 18:25:08

标签: php websocket bit-manipulation

我正在使用PHP编写Web套接字服务器,因为我找不到支持RFC 6455规范的服务器。在这样做时,我使用phpwebsocket代码作为基础并使其与RFC 6455兼容。至少我做了接收消息部分。当我尝试将消息发送回服务器时,我得到不同的消息。我确信这是因为我的掩盖技巧......非常糟糕。经过相当多的试验和错误后,我仍然遇到这个问题,我不明白为什么。

  Time                     OpCode Mask Length Data
1>2012-06-25T18:05:58.014Z 1      true 4      Ping
2>2012-06-25T18:06:02.121Z 1      true 5      hello
3 2012-06-25T18:06:02.121Z A server must not mask any frames that it sends to the server.

3 2012-06-25T18:06:02.121Z Unexpected continuation frame.

我在计算机上使用PHP 5.4.4,使用命令行界面。我需要做php ws.php才能启动Web套接字服务器。然后我使用wsClient.html作为我的客户。在Windows 8 Preview上使用最新版本的Google Chrome(21.0.1180.4 dev-m),我收到以下消息。

您可以从我的github repo下载php服务器和客户端,并从那里玩很长时间。问题出在WebSockets::send函数中。

private function send($client, $payload)
{
    $frame = pack('C2a*', 0b10000001, 0b01111111 & strlen($payload), $payload);
    socket_write($client, $frame, strlen($frame));
}

我做错了什么?

2 个答案:

答案 0 :(得分:0)

该消息表示浏览器正在获取一个连续帧(操作码为0)而不是文本帧(操作码为1)。我认为你的打包功能不像你想要的那样工作。我不是PHP专家,但也许更像是你想要的东西:

$plen = strlen($payload);
$frame = pack('CCa{$plen}', ...

此外,当有效负载超过125个字节时,您的有效负载长度计算将会中断。对于126到65535字节的有效负载,您需要将长度放在标头的第三个和第四个字节中。对于65536及更长的paylod,您需要将有效负载长度放在标头的第3到第10个字节中(标头的长度根据有效负载长度而变化)。

答案 1 :(得分:0)

我的问题是,在使用二进制语法时,我使用的是little-endian样式而不是big-endian样式。当我应该做0b10000001, 0b01111111时,我正在做0b10000001, 0b11111110