免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2142 | 回复: 2
打印 上一主题 下一主题

tcp 编程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-29 00:43 |只看该作者 |倒序浏览
tcp的一个client,用netstat -a看好多socket处于CLOSE_WAIT 状态,这个是怎么引起的,怎样才能避免?

论坛徽章:
0
2 [报告]
发表于 2007-04-29 08:51 |只看该作者
引用自CSDN:
  CLOSE_WAIT状态的生成原因   
  首先我们知道,如果我们的Client程序处于CLOSE_WAIT状态的话,
  说明套接字是被动关闭的!因为如果是Server端主动断掉当前连接的话,
  那么双方关闭这个TCP连接共需要四个packet:   
        Server     --->     FIN     --->     Client   
           Server     <---     ACK     <---     Client   
  这时候Server端处于FIN_WAIT_2状态;而我们的程序处于CLOSE_WAIT状态。   
       Server     <---     FIN     <---     Client   
  这时Client发送FIN给Server,Client就置为LAST_ACK状态。   
    Server     --->     ACK     --->     Client   
  Server回应了ACK,那么Client的套接字才会真正置为CLOSED状态。
不管怎么样,我们必须防止类似情况再度发生:
首先,我们要防止不断开辟新的端口,这可以通过设置SO_REUSEADDR套接字选项做到:重用本地地址和端口:

  1.                          int   nREUSEADDR   =   1;   
  2.                          setsockopt(sockConnected, SOL_SOCKET,   SO_REUSEADDR,   
  3.     (const   char*)&nREUSEADDR,   sizeof(int));
复制代码

其次,我们要设置SO_LINGER套接字选项,在connect成功建立连接之后设置该选项:
  1.   
  2. linger   m_sLinger;   
  3. m_sLinger.l_onoff   =   1;     //   (在closesocket()调用,但是还有数据没发送完毕的时候容许逗留)   
  4. m_sLinger.l_linger   =   0;   //   (容许逗留的时间为0秒)   
  5. setsockopt(sockConnected,    SOL_SOCKET,   SO_LINGER,  (const   char*)&m_sLinger,    sizeof(linger))
复制代码

不知道能否解决问题?我一般采用第二种方法,在close之前调用

[ 本帖最后由 duanjigang 于 2007-4-29 08:59 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2007-04-29 14:04 |只看该作者
支持一下楼上,试试
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP