C++ Websocket recv 2 bytes

C++ Websocket recv 2 bytes

本文关键字:bytes recv Websocket C++      更新时间:2023-10-16

Helo。我正在开发一个C++Websocket库。一切都很好,直到出现了一个奇怪的问题。

    int n = 0, n_add = 0;
char *buf = (char*)malloc(BUFLEN);
char new_buffer[4096];
while ((n = recv(client_id, buf, BUFLEN, 0)) > 0) {
    strcat(new_buffer, buf);
    int new_buffer_length = strlen(new_buffer);
    int buf_length = strlen(buf);
    n_add+= n;
    // debug
    cout << "buf: '" << buf << "'" << endl;
    cout << "new_buffer_length: '" << new_buffer_length << "'" << endl;
    cout << "buf_length: '" << buf_length << "'" << endl;
    cout << "n: '" << n << "'" << endl;
    cout << "n_add: '" << n_add << "'" << endl;
    memset(buf, '', BUFLEN);
    if (n_add == new_buffer_length && n < BUFLEN) {
        cout << "new_buffer: '" << new_buffer << "'" << endl;
        // if client is already connected
        if (ws_clients[client_id][2] == WS_READY_STATE_OPEN) {
            this->ws_client_message(client_id, new_buffer, new_buffer_length);
        }
        // if client needs a handshake
        if (ws_clients[client_id][2] == WS_READY_STATE_CONNECTING) {
            this->ws_client_handshake(client_id, new_buffer);
        }
        memset(&new_buffer, '', 4096);
        n_add = 0;
        FD_ZERO(&this->tmp_fds);
    }
}

握手与小于126的任何有效载荷一样完美地完成。当这种情况发生时,我得到了这个:

buf: 'þ'
new_buffer_length: '2'
buf_length: '2'
n: '128'
n_add: '128'
buf: '½HÆA¯J'
new_buffer_length: '8'
buf_length: '6'
n: '6'
n_add: '134'

n说我收到了128个字节,但实际上只有2个,第二次给了我6个字节,这些都可以。如果我把BUFLEN(限制为128(改为2,我会得到所有的东西,除了最后一个循环,它永远不会达到134,即实际的有效载荷长度。

好的,所以如果每个人都有任何想法,我正在使用http://www.websocket.org/echo.html为了测试,我什么都试过了。请给我一些提示

RFC6455的数据帧部分显示websocket消息不是纯文本,也不是以null结尾的字符串。您不能在阅读的消息上使用像strlenstrcat这样的C字符串处理函数。

如果要继续使用C字符串,请使用n来确定已读取的字节数,并使用strncpy将其添加到缓冲区中。不过,由于您正在编写C++服务器,如果改用std::string,您可能会发现事情会变得更容易。

处理128个字符左右的消息的差异可能来自于这样一个事实,即用于指示消息长度的字节数对于长度超过125字节的有效载荷会增加。对于长度在126和255字节之间的消息,在扩展的有效载荷长度中将有一个零字节。您的代码会(错误地(将其解释为C字符串的终止符。

char*不一定是C字符串,它必须正确终止。

while ((n = recv(client_id, buf, BUFLEN, 0)) > 0) {
    strcat(new_buffer, buf);
    ....

无论在buf中收到什么,这个拼写问题都可能不会被"\0"终止。当你调用strcat时,它不起作用。

检查strcat和strncat函数的手册,确保正确使用这些函数。