c - 使用 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);
}
}
解决方案
(流)套接字处理字节流,而不是消息。因此,它们提供了一种在端点之间获取字节流的方法,仅此而已。如果您想要某种“消息”,您需要处理字节流以查找消息边界并自己将其分解为消息。
执行此操作的常用方法是使用缓冲区,例如 C FILE 对象或 C++ streambuf。您安排从套接字读取字节到缓冲区,然后检查缓冲区中是否有完整的消息,通常通过查找消息终止符/边界标记(例如 \r\n 或只是 \n)。如果有,则从缓冲区中删除(仅)该消息。
在 C 中使用 POSIX 很容易做到——您可以使用fdopen
套接字描述符打开 FILE,然后使用 fgets 或 getline 将消息读取到换行符。
推荐阅读
- python - Python 线程 Selenium
- php - BLOB 正确插入 DB,但未在 HTML 中显示
- sapui5 - 搜索字段:过滤嵌套对象
- python - 在python上检查数据框中的连续值
- android - 如何在 Android Studio 中使用 Firebase 保存图像的 URL
- python - 如何在 Django 中为电影模型添加多个演员?
- office-js - 适用于 Mac OS 和 Windows 的 Word 插件安装
- windows - 如何在 Google 电子表格上添加本地文件的链接?
- python - 创建无法登录的django用户
- sql-server - Select–String :术语“Select–String”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称