libwebsocket: невозможно записать кадр размером более 7160 байт

Я решаю проблему с 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 байтов, зарезервированных для полезной нагрузки, поэтому я ожидал, что смогу отправлять максимальный объем данных 8 КБ, но 7160 (байт) — это максимальный объем данных, который я могу отправить.
Любая помощь приветствуется, спасибо!

2

Решение

Я столкнулся с подобной проблемой с более старой версией libwebsockets. Хотя я не контролировал лимит, это было почти одно и то же: n < write_len, Я думаю, что мой лимит был намного ниже, ниже 2048B, и я знал, что тот же самый код прекрасно работал с более новой версией libwebsockets (на другой машине).

Так как Debian Jessie не имеет lws v1.6 в репозиториях, я собрал его из Источники GitHub. Рассмотрите возможность обновления, это может помочь решить вашу проблему. Осторожно, они изменили API. В основном это было переименование имен методов из libwebsocket_ * в lws_ *, но некоторые аргументы изменились. Проверь это тянуть запрос который мигрирует шаблонный сервер libwebsockets до версии 1.6. Большая часть этих изменений повлияет на ваш код.

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);
}
0

По вопросам рекламы [email protected]