我的朋友正在学习如何在他的网络服务器上乱搞WebSockets,所以我决定尝试学习如何将我的HTTP / 1.1连接升级到成功运行的WebSockets!但我发送新的websocket协议数据,但我检索加密/压缩等信息。
所以我的问题是
代码:(这根本没有调试,因为我只是快速连接到我发现与Fiddler搞乱的WebSocket echo服务器)
int main()
{
WSADATA WsaData = { 0 };
WSAStartup(MAKEWORD(2, 2), &WsaData);
addrinfo hints = { 0 }, *results = nullptr;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_socktype = SOCK_STREAM;
hints.ai_family = AF_INET;
getaddrinfo("echo.websocket.org", "80", &hints, &results);
SOCKET hSocket = socket(results->ai_family, results->ai_socktype, results->ai_protocol);
connect(hSocket, results->ai_addr, static_cast<int>(results->ai_addrlen));
std::string SendBuffer;
SendBuffer = "GET http://echo.websocket.org HTTP/1.1\r\n";
SendBuffer += "Host: echo.websocket.org\r\n";
SendBuffer += "Upgrade: websocket\r\n";
SendBuffer += "Connection: Upgrade\r\n";
SendBuffer += "Origin: http://www.websocket.org\r\n";
SendBuffer += "Sec-WebSocket-Key: BBw/08+HrO3UfLPU/jeq1g==\r\n";
SendBuffer += "Sec-WebSocket-Version: 13\r\n";
SendBuffer += "Sec-WebSocket-Protocol: chat\r\n\r\n";
char RecvBuffer[1024], MessageBuffer[50];
int ReturnCode = 0;
ReturnCode = send(hSocket, SendBuffer.c_str(), SendBuffer.length(), 0);
ReturnCode = recv(hSocket, RecvBuffer, 5000, 0);
ReturnCode = send(hSocket, "Hello!", 7, 0);
ReturnCode = recv(hSocket, MessageBuffer, 50, 0);
return 0;
}
WebSocket协议 - 升级响应:
HTTP/1.1 101 Web Socket Protocol Handshake
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: content-type
Access-Control-Allow-Headers: authorization
Access-Control-Allow-Headers: x-websocket-extensions
Access-Control-Allow-Headers: x-websocket-version
Access-Control-Allow-Headers: x-websocket-protocol
Access-Control-Allow-Origin: http://www.websocket.org
Connection: Upgrade
Date: Wed, 19 Oct 2016 23:54:17 GMT
Sec-WebSocket-Accept: 6+RXVMNG1sZqeIs/Y1tlISzHAFI=
Server: Kaazing Gateway
Upgrade: websocket
将数据发送到WebSocket响应:
\x2\x3\ê
答案 0 :(得分:3)
请阅读定义WebSocket协议的RFC 6455。特别是section 5: Data Framing 和section 6: Sending and Receiving Data。
WebSocket不是纯文本协议。它实际上是一个使用成帧消息的二进制协议,可能包含文本数据:
成功握手后,客户端和服务器以本规范中提到的概念单位来回传输数据&#34; message&#34;。在线上,消息由一个或多个帧组成。 WebSocket消息不一定对应于特定的网络层框架,因为碎片消息可能由中间人合并或拆分。
帧具有关联类型。属于同一消息的每个帧包含相同类型的数据。从广义上讲,有文本数据的类型(解释为UTF-8 [RFC3629]文本),二进制数据(其解释留给应用程序)和控制框架(不打算为应用程序传送数据)但是代替协议级信令,例如发信号通知连接应该关闭)。该版本的协议定义了六种帧类型,留下了十种用于将来使用。
您的代码根本没有考虑到这一点。就套接字代码而言,唯一的纯文本部分是初始HTTP升级握手。握手完成后,您必须发送和接收带帧的二进制消息。不幸的是,框架过程有点复杂。
您最好的选择是不要手动实现WebSocket,而是使用现有的WebSocket库,例如libwebsockets,WebSocket++,easywsclient等。
答案 1 :(得分:0)
在升级响应中,您明确告诉服务器您允许压缩:
SendBuffer += "Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits\r\n\r\n";
如果您不想要压缩,请移除permessage-deflate
扩展名。