libwebsocket:无法写入大于7160字节的帧

时间:2015-12-01 14:56:41

标签: 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&lt; 8000 即可。
你对这种行为有什么解释吗?
我已经为有效负载分配了一个8000字节的缓冲区,所以我希望能够发送8K的最大数据量,但7160(字节)似乎是我可以发送的最大数据量。
感谢任何帮助,谢谢!

2 个答案:

答案 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);
}