首页 > 解决方案 > 使用 recv() 接收消息块

问题描述

我正在使用 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);

            }
}

标签: cwebsocketrecv

解决方案


(流)套接字处理字节流,而不是消息。因此,它们提供了一种在端点之间获取字节流的方法,仅此而已。如果您想要某种“消息”,您需要处理字节流以查找消息边界并自己将其分解为消息。

执行此操作的常用方法是使用缓冲区,例如 C FILE 对象或 C++ streambuf。您安排从套接字读取字节到缓冲区,然后检查缓冲区中是否有完整的消息,通常通过查找消息终止符/边界标记(例如 \r\n 或只是 \n)。如果有,则从缓冲区中删除(仅)该消息。

在 C 中使用 POSIX 很容易做到——您可以使用fdopen套接字描述符打开 FILE,然后使用 fgets 或 getline 将消息读取到换行符。


推荐阅读