c语音网络程序中用 recv函数接受数据会遇到不知道对方发送多长数据的问题

[复制链接]
查看11 | 回复7 | 2021-1-27 05:27:05 | 显示全部楼层 |阅读模式
如果不知道对方发送多少数据,recv就有可能遇到这次recv恰好把数据接受完了,但又不知道,从而再次recv,但是recv是阻塞的,只要对方不发送数据,recv就始终阻塞等待,就像程序死掉一样。
请问大家是怎么解决这个问题的呢?
分 -->
回复

使用道具 举报

千问 | 2021-1-27 05:27:05 | 显示全部楼层
哪位给个答案
回复

使用道具 举报

千问 | 2021-1-27 05:27:05 | 显示全部楼层
在独立的线程中等待。另外,如果是tcp的,最好定义一个数据结构,指定长度。因为tcp的流会连续到来,有可能尾巴上有半个包
回复

使用道具 举报

千问 | 2021-1-27 05:27:05 | 显示全部楼层
用多线程吧,把接受单独放一个线程。或者使用套接字的非阻塞模式
回复

使用道具 举报

千问 | 2021-1-27 05:27:05 | 显示全部楼层
比较省事的方法就是用一些类似libuv、libev等库,直接在回调函数中处理数据,不需要去关心数据到底啥时候来。或者用select、epoll等来管理套接字。单独开线程接收也可以。
回复

使用道具 举报

千问 | 2021-1-27 05:27:05 | 显示全部楼层
加一个头部信息,来确定具体该获得具体多长的消息。

回复

使用道具 举报

千问 | 2021-1-27 05:27:05 | 显示全部楼层
recv最后参数用MSG_PEEK,可以窥探是否有数据

回复

使用道具 举报

千问 | 2021-1-27 05:27:05 | 显示全部楼层
业务数据加上个包头,在包头中记录数据长度。
接收数据后先解析数据长度,没有接收足长则继续。否则就退出循环。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行