c++ - libwebsocket : unable to write frame bigger than 7160 bytes

标签 c++ linux tcp payload libwebsockets

我正在解决一个我无法理解的 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/

相关文章:

c++ - 如何使用 QWebEngineUrlRequestInterceptor

linux - 如何在 bash 中连接两个字符串作为文件名?

c# - 如何使用 .Net 套接字重用 TCP 端点地址

java - 为什么java tcp服务器接受关闭的套接字?

sockets - 为什么 'netstat' 无法检测到某些打开的套接字?

python - OpenCV 寻找图像的紧密匹配

c++ - 当默认参数已经定义时,调用不带参数的函数

c++ - 在 OMNeT++ 中定期添加主机

linux - 编译内核不使用 initrd

c - 如何检查没有root权限安装的C库?