使用 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 并且用户代码会崩溃。
我正在使用 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 并且用户代码会崩溃。