日期:2014-05-16  浏览次数:20738 次

网络编程中,当服务端连接断开时,客户端仍然可以调用send成功
如题,服务端断开与客户端的连接:
shutdown(s, SHUT_RDWR);
close(s);

但客户端仍然可以send数据,而且成功(当然只是函数调用成功,数据不可能真正发送出去),我每次send三个字节,有时候可以send十多次,之后返回EPIPE,有时候只能send两三次,之后返回EPIPE

注:客户端是阻塞的、tcp协议

开始我以为是时间问题,故意在连接断开之后,等了许久,结果还是能send十多次。
如果我不停的对s做recv调用,相信很快就能知道服务端断开连接了。
我想问的是,要快速的检测到服务端断开(就说正常断开吧,异常不考虑,那要用心跳包),客户端必须要不停的调用recv吗(就算服务端不会发送任何数据)?这是tcp协议的规定还是linux没有实现好,我记得windows好像没有这个问题。

------解决方案--------------------
貌似客户端的send不能立即检测连接的关闭

不了解具体原因 呵
------解决方案--------------------
服务端单方shutdown并不表示连接已断开。只表示服务端socket已不可用,并发送了通知给客户端,要求断开。客户端读到-1即认为文件流已结束,调用shutdown发送断开请求给服务端,彻底关闭tcp连接。TCP/IP协议断开部分可以参考 TCP三部曲。。。
------解决方案--------------------
断开还要4路握手呢...

反正我是没遇到过close之后还检查检查是否关闭成功的,关了就别管了,对端read 0就知道EOF了。