关于网络断开后,Recv和send返回值的问题
需要设置心跳包,setsockopt里面设SO_KEEPALIVE
lhbwhm回复于09日08点55分 找到原因了,原因在于中间网络瞬断导致丢包,因此recv 就一直接收不到,导致阻塞了。感谢大家参与讨论。
shiyinong回复于09日10点26分 tcp网络瞬断导致丢包?recv收不到?呵呵.........................................怎么可能
guotongcui回复于09日11点57分 不是吧,在阻塞模式下,对方SOCKET断掉,我方的 recv 也应该会返回的啊,返回值可能为 0或-1或其它错误码,不会一直不返回吧。
qazwsx11223344回复于09日13点32分 我的意思是,当我方进程阻塞调用 recv 时,对应SOCKET连接 的 对方进程处理过程中自己异常退出了,这个时候,我方进程种的 SOCKET 应该是能够检测到对端异常退出了,然后 recv 会返回值为 -1 的,不是吗?只有在网线拔掉等物理硬件导致网络异常,recv才会检测不到,这个时候才需要使用心跳包啊。
我的情况恰恰就是,当没有物理硬件异常,对端程序自己异常退出的情况下,我这边的 recv 却一直阻塞,没有返回!我不知道这种情况为何会发生。
另外,我这里不好设置超时时间的,因为对应的各种网络命令的执行时间长短不一,设置短了会影响正常流程。
happylife99回复于09日14点54分 阻塞模式会一直等待数据不返回。
smileの小兰回复于09日16点19分 不要以“只有在网线拔掉等物理硬件导致网络异常,recv才会检测不到”这种表象来看socket,真正的recv检测不到是因为收不到FIN(正常4次握手关闭)或RESET(强制关闭),你抓下包看看,收到FIN并且你的读缓冲已经无数据时,你的recv一定返回网络异常,如果收到RESET则是马上recv返回。TCP在网络异常上的判断实际上还是不完善的,上层如果要做的好一些,必须要有自己的心跳机制(最好不要依赖Keep-alive)
初一六班回复于09日17点50分 socket的阻塞模式会没有响应。
鑫鑫爸回复于09日19点23分 不是吧,在阻塞模式下,对方SOCKET断掉,我方的 recv 也应该会返回的啊,返回值可能为 0或-1或其它错误码,不会一直不返回吧。
MSDN:
If no incoming data is available at the socket, the recv call blocks and waits for data to arrive according to the blocking rules defined for WSARecv with the MSG_PARTIAL flag not set unless the socket is nonblocking. In this case, a value of SOCKET_ERROR is returned with the error code set to WSAEWOULDBLOCK. The select, WSAAsyncSelect, or WSAEventSelect functions can be used to determine when more data arrives.
本站所有文章欢迎任何形式的转载,但请注明作者及出处,尊重他人劳动成果!
文章转载自:中国研发网 [http://www.yanfaw.com]
本文标题:关于网络断开后,Recv和send返回值的问题
文章转载自:中国研发网 [http://www.yanfaw.com]
本文标题:关于网络断开后,Recv和send返回值的问题










