2

理解できない 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 バイトより大きいデータを送信しようとすると、常に同じエラーが表示されます。たとえば、Partial write: 7160 < 8000です。
その行動について何か説明はありますか?
ペイロード用に 8000 バイトのバッファを割り当てたので、最大 8K のデータを送信できると予想していましたが、送信できるデータの最大量は 7160 (バイト) のようです。
どんな助けでも大歓迎です、ありがとう!

4

2 に答える 2

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);
}
于 2016-10-12T15:09:58.390 に答える