【发布时间】:2020-05-07 20:44:57
【问题描述】:
我正在使用 WebSockets。我创建了一个小型测试客户端,它拆分消息,然后逐块发送。例如这样的消息:
PROTOCOL HTTP ACTION UPDATE
可以发送为
PROTOC
然后作为一个块
OL HTT
作为另一种方法,而不是将完整的消息以PROTOCOL HTTP ACTION UPDATE 的形式发送到一个块中,这也是一种可能性。
所以我接收信息的方式必须反映这一点。目前,我不确定如何使用recv,因为一条消息将被分成多个部分并发送出去。
这是我正在尝试的,但我不确定这是否是正确的方法。接收时是否应始终将缓冲区大小保持为 200?我应该什么时候退出循环?
void recv_all(){
char rec_buffer[200]
while(1) {
ssize_t bytes_rec = recv(socket_fd, rec_buffer, sizeof(rec_buffer),0);
}
}
【问题讨论】:
-
recv()从套接字读取任意原始字节。它没有 WebSockets 或任何其他协议的概念。您需要读取原始字节并根据RFC 6455 手动重建 WebSocket 消息,然后才能重建跨越多个 WebSocket 消息的文本数据块。您为什么不使用为您处理此问题的 WebSocket 库? -
你可以尝试使用像github.com/zaphoyd/websocketpp这样的网络套接字解析器
-
另请注意,
recv()是低级读取,实际上,当 flags 参数为0时,它等价于read()。唯一的区别是是否消费了未决的数据报。recv()会,read()不会。所以recv只是从流中读取原始字节——您将其指定为第一个参数。