我正在使用Poco和c ++编写服务器端WebSocket。现在,我正在尝试接受HTTP请求以升级到WebSocket。当我对其进行测试时,它会引发错误,说明请求的格式不正确。因此,我在gdb中打开了它,并打印了请求,发现它确实不是常规的WebSocket升级请求。这是GDB的输出。
(gdb) x/518xb buf
0x7fffffffb920: 0x16 0x03 0x01 0x02 0x00 0x01 0x00 0x01
0x7fffffffb928: 0xfc 0x03 0x03 0x8c 0x36 0x36 0x84 0x63
0x7fffffffb930: 0x9b 0x72 0x68 0x55 0xe2 0xad 0x61 0x63
0x7fffffffb938: 0xd8 0x05 0x94 0x69 0x6a 0x2e 0xf5 0x09
0x7fffffffb940: 0xac 0x10 0xc5 0xe8 0x6b 0x93 0x87 0x8f
0x7fffffffb948: 0x34 0xf6 0x4e 0x20 0xe6 0x1c 0x52 0xd6
0x7fffffffb950: 0x39 0xd4 0x46 0xae 0x03 0xe5 0x92 0xf3
0x7fffffffb958: 0x56 0x2e 0x33 0xc7 0x30 0x9a 0xc8 0xbd
0x7fffffffb960: 0xc6 0x72 0x82 0x47 0x2f 0x9a 0x2d 0xb4
0x7fffffffb968: 0x43 0x77 0x6d 0xbb 0x00 0x24 0x13 0x01
0x7fffffffb970: 0x13 0x03 0x13 0x02 0xc0 0x2b 0xc0 0x2f
0x7fffffffb978: 0xcc 0xa9 0xcc 0xa8 0xc0 0x2c 0xc0 0x30
0x7fffffffb980: 0xc0 0x0a 0xc0 0x09 0xc0 0x13 0xc0 0x14
0x7fffffffb988: 0x00 0x33 0x00 0x39 0x00 0x2f 0x00 0x35
0x7fffffffb990: 0x00 0x0a 0x01 0x00 0x01 0x8f 0x00 0x00
0x7fffffffb998: 0x00 0x0e 0x00 0x0c 0x00 0x00 0x09 0x6c
0x7fffffffb9a0: 0x6f 0x63 0x61 0x6c 0x68 0x6f 0x73 0x74
0x7fffffffb9a8: 0x00 0x17 0x00 0x00 0xff 0x01 0x00 0x01
0x7fffffffb9b0: 0x00 0x00 0x0a 0x00 0x0e 0x00 0x0c 0x00
0x7fffffffb9b8: 0x1d 0x00 0x17 0x00 0x18 0x00 0x19 0x01
0x7fffffffb9c0: 0x00 0x01 0x01 0x00 0x0b 0x00 0x02 0x01
0x7fffffffb9c8: 0x00 0x00 0x23 0x00 0x00 0x00 0x10 0x00
0x7fffffffb9d0: 0x0e 0x00 0x0c 0x02 0x68 0x32 0x08 0x68
快速浏览一下十六进制显示它不是普通字符。有很多非字母数字字符。但是,当我在浏览器中检查网络活动时,它会显示请求的文本,以天为单位。那么,为什么我的程序接收的字节与浏览器声称发送的字节不同?
服务器端(c ++):
#include <iostream>
#include "Poco/Net/ServerSocket.h"
#include "Poco/Net/StreamSocket.h"
#include "Poco/Net/SocketAddress.h"
#include "Poco/Net/HTTPRequestHandlerFactory.h"
#include "Poco/Net/HTTPRequestHandler.h"
#include "Poco/Net/HTTPServerResponse.h"
#include "Poco/Net/HTTPServerRequest.h"
#include "Poco/Net/HTTPServerResponseImpl.h"
#include "Poco/Net/HTTPServerRequestImpl.h"
#include "Poco/Net/HTTPServerConnection.h"
#include "Poco/Net/HTTPServerParams.h"
#include "Poco/Net/HTTPServerSession.h"
#define PORT (unsigned short) 3000
#define MAX_BYTES 9999
int main()
{
Poco::Net::ServerSocket x(PORT);
Poco::Timespan timeout(25000000);
char buf[MAX_BYTES];
memset(buf,0,MAX_BYTES);
if (x.poll(timeout, 1)) {
Poco::Net::StreamSocket ss = x.acceptConnection();
int i = ss.receiveBytes(buf, MAX_BYTES);
printf("received %d bytes, %s\n", i, buf);
}
return 0;
}
客户端(javascript):
$(document).ready(function() {
webSoc = new WebSocket("wss://localhost:3000");
webSoc.onopen = function (event) {
$("#c").click(function () {
webSoc.send("Hello, World!\n");
});
}
});
答案 0 :(得分:1)
您通过wss
进行连接,这意味着将使用SSL或TLS对连接进行加密。这些操作以握手开始,即第一个0x16字节。接下来是加密类型0x03 0x01(TLS 1.0),然后是2个字节的长度。然后为0x01,表示客户端问候等等。因此,这是完全正常的。
如果要进行普通的HTTP会话,请使用ws
协议。
答案 1 :(得分:0)
我得到了一个字符。我将"wss://localhost:3000"
更改为"ws://localhost:3000"
wss
代表WebSocket Secure。因此,我的websocket在发送数据之前先对其进行加密。服务器端套接字试图将其解释为未经加密,并正确地发现了未加密套接字的格式错误。