首页 > send 函数发送数据不全怎么办?

send 函数发送数据不全怎么办?

问题来源于一次面试。

我们知道,在tcp编程中,使用send套接字IO函数时,此次 send 成功返回时候(返回0),并不代表data已经全部发送到了对端,只是代表了 data 全部由用户态拷贝到了内核态的协议栈发送缓冲区中,而具体的发送工作,其实是由协议栈来完成。

那么,当send成功返回时,如果data并未全部成功发送,即假设还有 100KB 的data,在传输过程中因为网络原因,未能传输到对端,此时在对端通过 recv 就不能完全收到所有的data。

面对这种情况,该怎么办呢?

--------------------------------------------------华丽的分割线---------------------------------

针对上面的问题,我在此给出我的看法

1)发送端是可以感知到 send 的数据是否发送完全的。 即使此次使用 send 时候,成功返回了,但是如果在传输过程中,data 未能发送完全,那么必然是会产生错误的,而这个错误,在此次使用 send 时是无法获得,但是在下一次使用网络IO接口(send/recv等)时,会返回这个错误。

所以根据这个,发送端是可以知道data是否正确到达对端。但是,仍然还有疑问,发送端发送不完全,可以选择重发,但是接收端接收不完全,难道选择丢弃?

2)接收端是否可以知道,自己接收的data是完整的?还是缺失的?

以下是我在知乎的提问:
https://www.zhihu.com/questio...


tcp连接的建立和关闭完全契合你的问题。相比与三次握手建立连接,关闭连接的过程更复杂。你要解决这个问题,可以给发送的数据中添加冗余信息来进行判断。


只要send返回正确了,socket能够保证数据一定发送到对端,即使遇到网络拥塞。当然,除非出现崩溃或者断开连接,就另说了。每个socket有相应的内核缓冲区,如果数据迟迟不能发送到对端,积压太多的话,终有send返回失败的时候。

对端如何知道数据是否接收成功?这就要靠上层协议来判断了,TCP只负责TCP包的必达,但一个上层协议数据payload,很可能分成了多个TCP包。很多上层协议,比如httpprotobuf,都有类似设计

【热门文章】
【热门文章】