我正在解决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&lt; 8000 即可。
你对这种行为有什么解释吗?
我已经为有效负载分配了一个8000字节的缓冲区,所以我希望能够发送8K的最大数据量,但7160(字节)似乎是我可以发送的最大数据量。
感谢任何帮助,谢谢!
答案 0 :(得分:0)
我遇到了旧版libwebsockets的类似问题。虽然我没有监控限制,但它几乎是一样的:n < write_len
。我认为我的限制是低于2048B,我知道相同的代码适用于较新版本的libwebsockets(在不同的机器上)。
由于Debian Jessie在存储库中没有lws v1.6,我是从github sources构建的。考虑升级,它可能有助于解决您的问题。小心,他们已经改变了api。它主要是将方法名称从libwebsocket_ *重命名为lws_ *,但也改变了一些参数。检查将{em>样板libwebsockets服务器迁移到版本1.6的pull request。大多数这些更改都会影响您的代码。
答案 1 :(得分:0)
我们解决了将libwebsockets更新为 1.7.3 版本的问题 我们还使用在通道可写时调用的自定义回调优化代码
void
WSManager::onWritable() {
int ret, n;
struct fragment *frg;
pthread_mutex_lock(&send_queue_mutex);
if (!send_queue.empty() && !lws_partial_buffered(wsi)) {
frg = send_queue.front();
n = lws_write(wsi, frg->content + LWS_PRE, frg->len, (lws_write_protocol)frg->mode);
ret = checkWsWrite(n, frg->len);
if (ret >= 0 && !lws_partial_buffered(wsi)) {
if (frg->mode == WS_SINGLE_FRAGMENT || frg->mode == WS_LAST_FRAGMENT)
signalResponseSent();
// pop fragment and free memory only if lws_write was successful
send_queue.pop();
delete(frg);
}
}
pthread_mutex_unlock(&send_queue_mutex);
}