拔下网线,linux下sendto还能发送成功,why?

来源:百度知道 编辑:UC知道 时间:2024/06/30 06:23:04
linux下,为什么我网线都拔了,sendto还能发送成功,在windows下若进行相同操作,sendto会返回SOCKET_ERROR。

这个问题关键在于,你用的udp服务,而不是tcp服务。

udp是无连接的,tcp是有连接的。

这个是关键,udp是只管发而不在意网络环境是什么样的。

其实你发送成功了,但是具体消息应该还在你机器网卡的缓冲区里。

再连接上网线,它会自动给你发出去的。

但是每个UDP包都有一个最长保存时间的。

一旦超过这个时间,它将会消失。

sendto函数只负责将你要发送的数据复制到内核,然后自己返回。内核会尝试发送数据,你把网线拔了,内核在发送完数据后会一直尝试接收ACK,收不到的话会尝试重发该数据,一直到超时,这通常要花费几分钟的时间,你的sendto正常返回是正常的,但是过一会你再调用read,write之类的操作套接口的函数就会返回错误.

你发送给谁了?自己机器上的账户?