用libwebsockets写部分数据

时间:2019-01-11 10:00:36

标签: libwebsockets

我正在使用libwebsockets v2.4。

对于我来说,该文档似乎与lws_write()函数的返回值无关。

如果它返回-1,则错误,并且邀请我关闭连接。对我来说很好。

但是,当它返回的值严格小于我通过的缓冲区长度时,我应该考虑必须写入以后无法写入的最后一个字节(在另一个WRITABLE回调事件中)。甚至有可能出现这种情况吗?

此外,考虑到在WRITABLE回调的上下文中始终使用lws_send_pipe_choked(),我是否应该在使用lws_write()之前使用lws_write()

1 个答案:

答案 0 :(得分:1)

我的理解是lws_write总是返回要求的缓冲区长度,除非发生错误。

如果在output.c(https://github.com/warmcat/libwebsockets/blob/v2.4.0/lib/output.c#L157)中查看lws_issue_raw()(结果由lws_write()返回),则可以看到,如果lws_ssl_capable_write()写入的长度小于提供长度后,lws将分配一个缓冲区来填充wsi-> trunc_alloc上的剩余字节,以便将来发送。

关于第二个问题,我认为在WRITABLE回调的上下文中调用lws_write()是安全的,而无需检查管道是否阻塞。但是,如果碰巧在回调中的lws_write()上循环,则必须调用lws_send_pipe_choked()才能保护对lws_write()的后续调用。如果不这样做,您可能会偶然发现这个断言https://github.com/warmcat/libwebsockets/blob/v2.4.0/lib/output.c#L83,并且用户代码将崩溃。