0

直升机。我正在开发一个 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, '\0', 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, '\0', 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 个字节,这些都可以。如果我将限制为 128 的 BUFLEN 更改为 2,我会一切正常,除了最后一个循环,它永远不会达到 134,即实际有效载荷长度。

好的,如果每个人都有任何想法,我正在使用http://www.websocket.org/echo.html进行测试,我尝试了一切。请给我一些提示

4

2 回答 2

0

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

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

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

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

于 2013-01-20T15:59:43.153 回答
0

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

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

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

于 2013-01-20T15:56:23.497 回答