Poco WebSocket引发格式错误的url异常。为什么?

时间:2019-07-02 22:32:24

标签: javascript c++ websocket poco-libraries

我正在使用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");
        });
    }
});

2 个答案:

答案 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在发送数据之前先对其进行加密。服务器端套接字试图将其解释为未经加密,并正确地发现了未加密套接字的格式错误。