【发布时间】:2017-11-26 01:21:21
【问题描述】:
我正在尝试用 C++ 制作一个简单的 websocket 服务器。我可以从我的 html/javascript 页面连接到我的服务器:
socket = new WebSocket("ws://127.0.0.1:6001/websocket");
我的服务器收到以下请求
GET /websocket HTTP/1.1
Host: 127.0.0.1:6001
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: http://127.0.0.1:6001
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
DNT: 1
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: en-US,en;q=0.8
Sec-WebSocket-Key: 4oyuqbJMJVtGRvVOd8KWKA==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
然后我回复
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: QQphkELDd37KE7awCUPSOhWJI1k=
到目前为止一切都很好。我可以通过
向我的服务器发送消息socket.send("Hello World!");
服务器可以成功解码的
Received data = ��56A$}S-HZKGZ%
---- WebsocketMessage ----
final = 1
rsv1 = 0
rsv2 = 0
rsv3 = 0
optcode = 1
masked = 1
payload size = 12
payload = Hello World!
--------------------------
但是当我尝试从我的服务器向我的网页发送消息时,我总是收到以下错误(chrome 控制台):
WebSocket connection to 'ws://127.0.0.1:6001/websocket' failed: Invalid frame header
这是我生成框架的代码(它在一个类中,所以我也会在下面包含成员变量,所有变量都提前初始化):
bool final_msg;
bool rsv[3] = { false, false, false };
int optcode;
bool masked;
unsigned long long payload_size;
std::string encode() {
std::string msg;
msg.push_back(
(char) (final_msg ? 0x80 : 0x00) | (rsv[0] ? 0x40 : 0x00) | (rsv[1] ? 0x20 : 0x00) |
(rsv[2] ? 0x10 : 0x00) | (0x0F & optcode)
);
msg.push_back(
(char) (masked ? 0x80 : 0x00) | (0x7F & payload_size)
);
msg += payload;
return msg;
}
目前此函数仅适用于打包小于 126 字节的消息。好吧,它应该可以工作,但根据 chrome 它似乎没有。这是测试 (PING) 消息的二进制输出:
1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
根据规范,这应该可以工作,并且“socket.onmessage”应该在我的页面上触发,而不是“onerorr”触发“event.data = undefined”。
谁能看到我哪里出错了?或者有任何想法如何获得更多有用的信息?谢谢!
【问题讨论】:
-
只是一个想法......你为什么使用
^和payload_size(而不是|? -
面具在哪里?
标签: javascript c++ google-chrome websocket send