socket接收数据,数据来不及处理的问题

bandaoyu bandaoyu 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

我有个担心,就是接收数据端,来不及处理缓冲中的数据时,socket的buff会不会被爆掉或者后面的数据覆盖前面的数据?


查资料得到下面的答案:

1、如果用udp,得自己加缓冲队列和多线程,缓冲队列也要有限制,防止爆内存。多线程的多用只要是异步化网络I/O和业务流程,不相互阻塞,起几个线程看情况

2、如果用tcp,缓冲队列可以不要,因为tcp自动调速,你接收慢对端发送也会降速,这时候根基性能要求起多线程,尽量用线程池+IO多路转接,别简单的一个线程一个链接,尤其是连接可能比较多的时候

关于2,我不大确定他的回复是否靠谱,因为:

“你接收慢对端发送也会降速”---- 问题来了,缓冲发送出去的速度慢了,但是应用层可能还要继续往发送缓冲中投入数据,这样的话,发送端的缓冲不就可能就爆了吗?


果真看到下面一个回复:

”对于TCP缓冲队列也是必须的,网络层不断接收,投递到缓冲队列,处理线程从队列中提取任务并处理。
但是为了防止处理线程无法处理大量任务导致缓冲队列爆掉,必须设置一个阀值,当缓冲队列中任务的数量
超过这个阀值时,网络层停止recv,这可以使得发送方发送速度减缓,但是如果你的采样频率是固定的,发送速度
减缓可能又会导致发送方发送队列爆满。“

也就是下面这位建议TCP 也要缓冲队列

那么我应该相信哪一位? 另外收发端应该如何做这样的队列?大家都有什么有见解呢?有没有什么例子或者资料 欢迎告诉我


...全文
评论 19
收藏 已收藏
分享
返回顶部
bandaoyu
C++ 语言 65,214 成员 250,514 内容