(libwebsocket) Как отправить пакет при подключении клиента

Я разрабатываю простой сервер веб-сокетов в Linux, используя libwebsocket lib.
Мне нужно отправить пакет инициализации при установленном событии для каждого клиентского соединения.
Если я использую

memcpy( p, "init", 4);
lws_write(wsi, p, 4, LWS_WRITE_TEXT);

in

case LWS_CALLBACK_ESTABLISHED:

я получаю сообщение об ошибке

[2018/07/31 18:50:15:5451] ERR: 
[2018/07/31 18:50:15:5451] ERR: 0000: 81 04 69 6E 69 74         ..init
[2018/07/31 18:50:15:5451] ERR: 
[2018/07/31 18:50:15:5451] ERR: ** 0x564b10ce5170: vh: default, prot: lws-minimal, role ws: Illegal back-to-back write of 6 detected...

Из документации я прочитал, что я не могу вспомнить lws_write в этой фазе, но не понимаю, как подготовить данные для фазы LWS_CALLBACK_SERVER_WRITEABLE (и затем вызвать lws_callback_on_writable(wsi);..).

Почему ошибка сообщает о 6 байтах, когда я записываю 4 байта?


person SteMMo    schedule 31.07.2018    source источник
comment
Я сам не использую libwebsockets, но полагаю, что 6 может быть связано с дополнительным двухбайтовым заголовком, прикрепленным к небольшим сообщениям (длиной менее 127 байт)... 2-байтовый заголовок + 4-байтовое сообщение => 6 байтов записано.   -  person Myst    schedule 03.08.2018


Ответы (1)


Согласно документам, lws_write() требует, чтобы LWS_PRE байтов доступно перед указателем, который вы передаете для записи.

char buf[LWS_PRE + 32];                           // buffer of any size plus the LWS_PRE
lws_strncpy(&buf[LWS_PRE], "init", 4);            // use their stncpy to null-terminate
lws_write(wsi, &buf[LWS_PRE], 4, LWS_WRITE_TEXT); // write from your buffer after LWS_PRE bytes.
person Moop    schedule 28.08.2018