使用 libwebsockets 写入部分数据

writing partial data with libwebsockets

我正在使用 libwebsockets v2.4。

文档似乎不清楚我必须如何处理 lws_write() 函数的返回值。

如果是returns-1,那就是错误,请我关闭连接。这对我来说很好。

但是当它 returns 的值严格低于我传递的缓冲区长度时,我是否应该考虑我必须写入以后无法写入的最后一个字节(在另一个 WRITABLE 回调事件中) .有没有可能出现这种情况?

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

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

如果您在 output.c (https://github.com/warmcat/libwebsockets/blob/v2.4.0/lib/output.c#L157) 中查看 lws_issue_raw()(结果由 lws_write() return 编辑) ,可以看到如果lws_ssl_capable_write()写入的长度小于提供的长度,那么lws会分配一个buffer来填充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 并且用户代码会崩溃。