网络编程中,当服务端连接断开时,客户端仍然可以调用send成功

youngwolf 2012-02-03 03:23:35
如题,服务端断开与客户端的连接:
shutdown(s, SHUT_RDWR);
close(s);

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

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

开始我以为是时间问题,故意在连接断开之后,等了许久,结果还是能send十多次。
如果我不停的对s做recv调用,相信很快就能知道服务端断开连接了。
我想问的是,要快速的检测到服务端断开(就说正常断开吧,异常不考虑,那要用心跳包),客户端必须要不停的调用recv吗(就算服务端不会发送任何数据)?这是tcp协议的规定还是linux没有实现好,我记得windows好像没有这个问题。
...全文
388 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wesleyluo 2012-02-03
  • 打赏
  • 举报
回复
服务器与客户端socket断开需要时间开销;可能这个时候还可以send;

还有你send后不一定是立即发送出去的,如果有缓冲区,等缓冲区满了一次性发送。
qq120848369 2012-02-03
  • 打赏
  • 举报
回复
断开还要4路握手呢...

反正我是没遇到过close之后还检查检查是否关闭成功的,关了就别管了,对端read 0就知道EOF了。
勤奋的沉沦 2012-02-03
  • 打赏
  • 举报
回复
服务端单方shutdown并不表示连接已断开。只表示服务端socket已不可用,并发送了通知给客户端,要求断开。客户端读到-1即认为文件流已结束,调用shutdown发送断开请求给服务端,彻底关闭tcp连接。TCP/IP协议断开部分可以参考 TCP三部曲。。。
justkk 2012-02-03
  • 打赏
  • 举报
回复
貌似客户端的send不能立即检测连接的关闭

不了解具体原因 呵

23,216

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧