C++ Websocket recv 2 bytes
C++ Websocket recv 2 bytes
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结尾的字符串。您不能在阅读的消息上使用像strlen
或strcat
这样的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函数的手册,确保正确使用这些函数。
相关文章:
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- Linux 服务器中的 Recv 缓冲区大小
- 在 for 循环中处理复杂的发送 recv 消息
- C++ TCP 套接字通信 - 连接按预期工作,几秒钟后失败,没有收到新数据,read() 和 recv() 块
- 在 Linux 中关闭 UDP 套接字后,recv 不会返回
- 为什么套接字中的 recv() 函数不返回任何内容?
- C++网络,recv() 无缘无故失败 (?)
- 设置SO_RCVTIMEO时,为什么recv返回-1并且errno=EINTR
- TCP套接字(客户端-服务器)recv()返回-1值
- 在UNIX中通过recv/send交换数据时,如何正确使用缓冲区
- C++中TCP套接字的recv函数
- 仅通过建立一次TCP连接将Recv从客户端发送到服务器套接字
- 为什么 sys 套接字 recv 函数不填充数据但返回字节长度?
- C++ 即使数据可用,Windows recv() 也不会返回
- c++ hooking ws2_32.dll recv
- Epoll zero recv() and negative(EAGAIN) send()
- Linux 套接字 recv 返回 -1,errno 110 连接超时
- 如何使用 recv 或 C++ 中的读取功能从 tcp 套接字读取大请求
- 为 posix recv 设置超时会导致 udp 数据包丢失吗?
- C++ Websocket recv 2 bytes