Я реализовал клиент websocket в C ++, используя libwebsocket.
Я хотел бы отправлять большие сообщения, но я ограничил полезную нагрузку сообщения до 8 КБ, и мне нужно использовать это значение полезной нагрузки.
Вот фрагмент моего кода инициализации:
void
WSManager::initProtocols(void)
{
memset(protocols, 0, sizeof(protocols));
protocols[0].name = "default";
protocols[0].callback = callback;
protocols[0].per_session_data_size = 1500;
protocols[0].rx_buffer_size = 8000;
/* End of the list */
protocols[1].name = NULL;
protocols[1].callback = NULL;
protocols[1].per_session_data_size = 0;
protocols[1].rx_buffer_size = 0;
}
Проблема сейчас в том, как отправлять сообщения больше 8К.
Есть ли способ bufferize данные или я должен использовать Fraggle?
Я нашел решение своей проблемы. Проблема была связана с флагами и кодом операции, используемыми для каждого фрагментированного кадра.
Взгляните на эту (libwebsocket) функцию записи:
int n = libwebsocket_write(wsi, &write_buffer[LWS_SEND_BUFFER_PRE_PADDING], write_len,(libwebsocket_write_protocol)write_mode);
write_mode должен быть установлен как ниже:
int write_mode;
write_mode = LWS_WRITE_BINARY; // single frame, no fragmentation
write_mode = LWS_WRITE_BINARY | LWS_WRITE_NO_FIN; // first fragment
write_mode = LWS_WRITE_CONTINUATION | LWS_WRITE_NO_FIN; // all middle fragments
write_mode = LWS_WRITE_CONTINUATION; // last fragment
Если вам нужно больше подробностей, прочитайте раздел фрагментации в WebSocket RFC:
https://tools.ietf.org/html/rfc6455#section-5.4
Других решений пока нет …