注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

死连接和半连接  

2014-10-08 11:43:31|  分类: 网络服务编程技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
死连接和半连接
在前面讲的几篇文章中,对死连接和半连接说得不是很清楚,有的地方甚至混做了一谈,其实这两种情况是不同的。具体的说来如下:
1、死连接,指一方处在CLOSE_WAIT状态,也就是说收到了对方的FIN但是自己没有发出FIN,原因可能是自己一方太忙,比如正读或写,或者写得程序比较差,忘记关闭当前SOCKET(比如忘记检查返回值是错误)。
举例说,当对方调用closesocket的时候,我的程序正在调用recv中,这时候有可能对方发送的FIN包我没有收到,而是由TCP代回了一个ACK包,所以我这边套接字进入CLOSE_WAIT状态。 
所以他建议在这里判断recv函数的返回值是否已出错,是的话就主动closesocket,这样防止没有接收到FIN包。 因为前面我们已经设置了recv超时时间为30秒,那么如果真的是超时了,这里收到的错误应该是WSAETIMEDOUT,这种情况下也可以主动关闭连接的。
知道了原因解决的方法就很简单:首先,端口重用;其次,增加心跳处理,无论是自己写的还是设置KEEPALIVE;最后,设置SO_LINGER。
当然,还有一些前提,那就是对接收和发送做严格的返回值的控制。
http://blog.chinaunix.net/uid-20357359-id-1963662.html
http://www.cnblogs.com/chenrj/archive/2010/04/23/1718589.html
http://www.cnblogs.com/zealic/archive/2008/03/15/1107942.html
2、半连接,指的是SOCKET通信的两端的任一端关闭或者异常终止,而对方没有接收到结束报文段(比如拔掉了网线,中间路由断电等)。这时候对方仍然认为彼此可以通信。即使另一端重启,这个SOCKET仍然是不被控制。这时候,向SOCKET里写入数据,会返回一个RST的复位报文段。从某种意义上来讲,这个也算死连接的一种。
这种方法最好的就是用心跳来解决。所以说,心跳机制在TCP通信中的作用是非常大的。

从上面的分析来看,死连接如果从字面的意义或者说应用的层次来说,是包含半连接的。半连接是死连接的一种。但是从实际的情况来看,还是区别相待来看好。毕竟这些术语目前没有非常正式的标准来确定,只是约定俗成。所以还是谨慎为妙。
  评论这张
 
阅读(306)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017