2015-05-04 390 views
2

我使用libwebsocket客户端发送二进制数据。我已将我的二进制数据保存到缓冲区[即buf]并写入套接字。libwebsocket发送有效负载限制

n = libwebsocket_write(wsi, 
     &buf[LWS_SEND_BUFFER_PRE_PADDING], l, opts | LWS_WRITE_BINARY); 

我的问题是插座能够只写22392个字节[正如我已经收到N = 22392]。当我> = 22392字节时,它被视为部分写入。该值因各种体系结构而异。

问:

  • 是否有libwebsocket数据大小的任何限制?

  • 任何方式来扩展缓冲区有效载荷值?

+0

感谢@戴维·施瓦茨。我是libwebsocket的新手。我也想知道什么阻止写入比22392字节更多的字节。 – Han

+0

如果您将套接字设置为非阻塞,那么当套接字尝试发送更多数据时,会发生部分写入。如果您将套接字设置为非阻塞,然后尝试写入,显然您必须*处理部分写入。 –

回答

5

我得到了我的问题的答案。这是阻止我的数据的有效负载值。根据数据大小调整有效负载值。

struct libwebsocket_protocols { 
    const char * name; 
    callback_function * callback; 
    size_t per_session_data_size; 
    size_t rx_buffer_size; 
    unsigned int id; 
    struct libwebsocket_context * owning_server; 
    int protocol_index; 
}; 

rx_buffer_size
你应该将其设置为你支持的最大的法律框架的大小。

将rx_buffer_size设置为65536后,我可以完全写入数据。

这里的链接帮助我
https://libwebsockets.org/trac/libwebsockets/ticket/40
https://libwebsockets.org/libwebsockets-api-doc.html

0

要么不使用这个库,要么使用阻塞套接字。这个库没有提供完成非阻塞I/O的方法。要在部分写入时执行理想的非阻塞I/O,您需要知道发送了多少个字节以及剩余多少个字节,以便您可以在套接字可再次写入时尝试写入其余字节。但这个图书馆只提供一个号码。没有办法告诉两件事。

(你不能仅仅从你想送,因为编码的数据比未编码的数据大的字节数中减去。)

+0

这使得我的程序延迟,因为我需要发送块大小有限的数据块。任何扩大有效载荷大小的可能性? – Han

+0

它确实与载荷大小几乎没有任何关系。即使使用一个字节的有效载荷,也可能会遇到此问题。使用libwebsocket和非阻塞套接字是一个问题。如果你没有看到它有更小的有效载荷,你只是幸运。使用阻塞套接字或使用更好的websocket库。 –

+0

那么,你推荐哪个库,然后呢? – br1