socket通信read丢失数据可能原因

博客讨论了在使用Linux系统调用read和write进行网络通信时,由于TCP协议的字节流特性和网络延迟,可能导致read和write返回的字节数少于预期。接收方可能需要多次调用recv来确保获取所有数据。问题在Python中尤为明显,小数据传输可能正常,但大数据传输时read可能会返回不足的字节数。解决办法是在代码中实现循环读取,直到读取到完整数据为止。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在csapp上看到read和write socket时

内部缓冲约束和较长的网络延时会引起read和write返回不足值,对linux管道调用read和write时,也可能出现不足值。

在网上查询了一下原因,stackoverflow上的这个解释感觉比较有道理

这个人遇到的问题是,用python的时候,如果只是传输小数据(1000字节),read会得到正确的结果,但是如果传输比较大的数据,例如9500字节,最后只能得到1000多的数据。

解释👇

TCP是面向字节流的协议,数据以字节的形式进行传输,长度取决于诸多因素,是没办法一次性读取32767个字节的。用recv的唯一保证是,每次都至少能读取到1字节or最多你指定的字节数目(也就是说recv的参数只是限制了我们读取的最大值,没有保证我们能一次性读到这么多
所以要在代码层面做修改,也就是说,要多次调用recv,直到读取到我们所需的所有数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值