导航
  • 主页
  • 系统维护与使用
  • 应用程序开发
  • 内核源代码
  • 驱动程序开发
  • CPU和硬件区
  • UNIX文化
  • Solaris
  • Power Linux
  • 问答

怎样关闭 socket server (客户端正连接时)

wmrwinhap 2004-05-09 04:36:14
我写了一个基于TCP/IP的C/S程序,结果是如果只要还有一个已连接的客户端没有先关闭,服务器端退出时可以看到客户端SOCKET被关闭,但SERVER重启动时还是无法绑定到端口,原因是该端口已经使用!!!
(客户端未连接或客户端先断开时关闭SERVER一切正常)

我的服务器端的关闭方法是,先关闭所有已连接的sock,再关闭SOCKET SERVER:

for(i=0;i<_MAX_CONNECT;i++) {
if(sock_cli[i]!=-1) {
shutdown(sock_cli[i],SHUT_RDWR);
close(sock_cli[i]);
sock_cli[i]=-1;
}
}
shutdown(sock_serv,SHUT_RDWR);
close(sock_serv);

应该怎样正常关闭SOCKET SERVER 释放绑定的端口呢 ?
...全文
71 点赞 收藏 8
写回复
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
laopang 2004-05-10
服务器端先关闭连接,TCP链路进入TIME_WAIT状态,需要持续120秒(默认,可以通过更改内核修改该值),
《TCP/IP详解》18章:
“TIME_WAIT状态也称为2MSL等待状态。每个具体TCP实现必须选择一个报文段最大生存时间M S L(Maximum Segment Lifetime)。它是任何报文段被丢弃前在网络内的最长时间。
我们知道这个时间是有限的,因为T C P报文段以I P数据报在网络内传输,而I P数据报则有限制其生存时间的T T L字段。
RFC 793 [Postel 1981c] 指出MSL为2分钟。然而,实现中的常用值是30秒,1分钟,或2分钟。
对一个具体实现所给定的MSL值,处理的原则是:当TCP执行一个主动关闭,并发回最后一个ACK,该连接必须在T I M E _ WA I T状态停留的时间为2倍的M S L。这样可让T C P再次发
送最后的A C K以防这个A C K丢失(另一端超时并重发最后的F I N)。
这种2MSL等待的另一个结果是这个T C P连接在2 M S L等待期间,定义这个连接的插口(客户的I P地址和端口号,服务器的I P地址和端口号)不能再被使用。这个连接只能在2 M S L
结束后才能再被使用。
回复
saoyu 2004-05-10
没办法立即释放的,必须要等待一段时间,一般是1分钟到4分钟,要立即使用的话可以用setsockopt设置套接口选项,采用端口复用SO_REUSEADDR
回复
wmrwinhap 2004-05-10
help help help !!!
回复
wmrwinhap 2004-05-10
OK ! OK ! OK !
Thanks very much !
回复
qiuafa 2004-05-10
up
回复
gaoxianfeng 2004-05-10
同意楼上
回复
rexp 2004-05-10
同意楼上的,可以采用SO_REUSEADDR选项
回复
tianxiangyuan 2004-05-10
是啊,需要等待一段时间。如果想立刻就能使用,通过setsockopt可以设置。
回复
发动态
发帖子
Linux/Unix社区
创建于2007-08-27

2.0w+

社区成员

Linux/Unix社区 应用程序开发区
申请成为版主
社区公告
暂无公告