我正在解决一个我无法理解的 WebSocket 问题。
请使用以下代码作为引用:
int write_buffer_size = 8000 +
LWS_SEND_BUFFER_PRE_PADDING +
LWS_SEND_BUFFER_POST_PADDING;
char *write_buffer = new unsigned char[write_buffer_size];
/* ... other code
write_buffer is filled in some way that is not important for the question
*/
n = libwebsocket_write(wsi, &write_buffer[LWS_SEND_BUFFER_PRE_PADDING], write_len,
(libwebsocket_write_protocol)write_mode);
if (n < 0) {
cerr << "ERROR " << n << " writing to socket, hanging up" << endl;
if (utils) {
log = "wsmanager::error: hanging up writing to websocket";
utils->writeLog(log);
}
return -1;
}
if (n < write_len) {
cerr << "Partial write: " << n << " < " << write_len << endl;
if (utils) {
log = "wsmanager-error: websocket partial write";
utils->writeLog(log);
}
return -1;
}
当我尝试发送大于 7160 字节的数据时,我总是收到相同的错误,例如部分写入:7160 < 8000。
你对这种行为有什么解释吗?
我已经为有效负载分配了一个保留了 8000 字节的缓冲区,所以我希望能够发送最大 8K 的数据量,但 7160(字节)似乎是我可以发送的最大数据量。
感谢任何帮助,谢谢!
最佳答案
我在使用旧版本的 libwebsockets 时遇到过类似的问题。虽然我没有监控限制,但它几乎是同一件事:n < write_len
.我认为我的限制要低得多,低于 2048B,而且我知道相同的代码可以在较新版本的 libwebsockets 上正常工作(在不同的机器上)。
由于 Debian Jessie 在存储库中没有 lws v1.6,我从 github sources 构建了它.考虑升级,它可能有助于解决您的问题。当心,他们已经改变了 api。它主要是将方法的名称从 libwebsocket_* 重命名为 lws_*,但也更改了一些参数。检查这个pull request它将 样板 libwebsockets 服务器 迁移到版本 1.6。其中大部分更改都会影响您的代码。
关于c++ - libwebsocket : unable to write frame bigger than 7160 bytes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34023367/