2015-05-04 3 views
2

У меня есть клиент libwebsocket для отправки двоичных данных. Я сохранил свои двоичные данные в буфере [т. buf] и запись в сокет.libwebsocket отправить ограничение полезной нагрузки

n = libwebsocket_write(wsi, 
     &buf[LWS_SEND_BUFFER_PRE_PADDING], l, opts | LWS_WRITE_BINARY); 

Моя проблема сокет может писать только 22392 байт [Как я получил п = 22392]. когда мой l> = 22392 байта замечен как частичная запись. Это значение варьируется для разных архитектур.

Вопрос:

  • Есть ли какие-либо ограничения размера данных в libwebsocket?

  • Любой способ увеличить полезную нагрузку на буфер?

+0

Спасибо @ Дэвид Шварц. Я новичок в libwebsocket. Я также хотел бы знать, что мешает писать больше байтов, чем 22392 байта. – Han

+0

Если вы устанавливаете сокет неблокирующимся, частичная запись будет происходить, когда сокет будет блокироваться, если он попытается отправить больше. Если вы устанавливаете сокет неблокирующимся, а затем пытаетесь записать его, очевидно, вы * должны * обрабатывать частичную запись. –

ответ

5

я получил ответ на мой вопрос. Это значение полезной нагрузки, которое мешало моим данным. Отрегулируйте значение полезной нагрузки в соответствии с размером данных.

struct libwebsocket_protocols { 
    const char * name; 
    callback_function * callback; 
    size_t per_session_data_size; 
    size_t rx_buffer_size; 
    unsigned int id; 
    struct libwebsocket_context * owning_server; 
    int protocol_index; 
}; 

rx_buffer_size
вы должны установить это размер самого большого правового кадра, который вы поддерживаете.

После установки rx_buffer_size до 65536 я могу полностью записывать данные.

Вот ссылки помогли мне
https://libwebsockets.org/trac/libwebsockets/ticket/40
https://libwebsockets.org/libwebsockets-api-doc.html

0

Либо не используйте эту библиотеку, либо используйте блокирующие сокеты. В этой библиотеке нет разумного способа делать неблокирующие операции ввода-вывода. Чтобы сделать нормальный неблокирующий ввод-вывод, на частичной записи, вам нужно знать, сколько байтов было отправлено и сколько осталось отправить, чтобы вы могли попытаться записать остальные, когда сокет будет перезаписываться снова. Но эта библиотека предоставляет вам только одно число. Невозможно сказать обе вещи.

(Вы не можете просто вычесть из числа байт, которые Вы хотели отправить, так как кодированные данные больше, чем некодированные данные.)

+0

Это заставляет меня задерживать программу, поскольку мне нужно отправить кусок данных куском с ограниченным размером. Любая возможность расширения размера полезной нагрузки? – Han

+0

Это действительно не имеет ничего общего с размером полезной нагрузки. Вы можете столкнуться с этой проблемой даже с одной байтовой полезной нагрузкой. Это проблема с использованием libwebsocket с неблокирующими сокетами. Если вы не видите его с меньшими полезными нагрузками, вам просто повезет. Либо используйте блокирующие сокеты, либо используйте лучшую библиотеку websocket. –

+0

Итак, какую библиотеку вы рекомендуете, то? – br1

Смежные вопросы