написание частичных данных с помощью libwebsockets - PullRequest
0 голосов
/ 11 января 2019

Я использую libwebsockets v2.4.

Документ кажется мне неясным относительно того, что я должен делать с возвращенным значением функции lws_write().

Если он возвращает -1, это ошибка, и мне предлагается закрыть соединение. Это хорошо для меня.

Но когда он возвращает значение, которое строго ниже длины буфера, который я передаю, я должен учитывать, что мне нужно записать последние байты, которые не могли быть записаны позже (в другом вхождении обратного вызова WRITABLE). Можно ли вообще иметь такую ​​ситуацию?

Кроме того, должен ли я использовать lws_send_pipe_choked() перед использованием lws_write(), учитывая, что я всегда использую lws_write() в контексте WRITABLE callback?

1 Ответ

0 голосов
/ 11 января 2019

Насколько я понимаю, lws_write всегда возвращает запрашиваемую длину буфера, за исключением случаев, когда возникает ошибка.

Если вы посмотрите на lws_issue_raw () (из которой результат возвращается lws_write ()) в output.c (https://github.com/warmcat/libwebsockets/blob/v2.4.0/lib/output.c#L157),), вы увидите, что если длина, записанная lws_ssl_capable_write (), меньше предоставленной length, тогда lws выделяет буфер для заполнения оставшихся байтов в wsi-> trunc_alloc, чтобы он был отправлен в будущем.

Относительно вашего второго вопроса, я думаю, что безопасно вызывать lws_write () в контексте обратного вызова WRITABLE без проверки, не засорен ли канал. Однако, если вам случится зациклить lws_write () в обратном вызове, необходимо вызвать lws_send_pipe_choked (), чтобы защитить последующие вызовы lws_write (). Если вы этого не сделаете, вы можете наткнуться на это утверждение https://github.com/warmcat/libwebsockets/blob/v2.4.0/lib/output.c#L83, и код пользователя вылетит.

...