[续]开发高性能服务器---SOCKET池---重用SOCKET---令人讨厌的CLOSE_WAIT状态

时间:2021-11-04 19:40:53
续上一个帖子: http://topic.csdn.net/u/20110312/00/c3863401-5100-4129-a838-17bb2312b869.html

实践证明重用SOCKET是可以实现的,当服务端主动关闭套接字的时候此SOCKET可以重用(完全的4次握手)

可从客户端关闭的时候,服务端的SOCKET总是处于CLOSE_WAIT状态,导致下一次AcceptEx失败.

网上有资料说设置LINGER可以缩短CLOSE_WAIT的时间,但是对于异步好像是无效的.

我是用的TELNET做测试,连接之后直接X掉,服务端出现CLOSE_WAIT状态,客户端(实际上进程已退出)出现WAIT_FIN_2状态.

请问大家有什么方法可以解决这个问题,包括写驱动也可以.

16 个解决方案

#1


你的重用的意思是,客户端关闭,服务器那边不把socket close 就继续用?
但我觉得这样不好吧?不太懂,来学习。

#2


是的,不用closesocket,断开之后继续用,在研究这方面.

#3


创建线程和关闭线程的开销大,于是有了线程池,
您的socket迟,如果能实现,原理也应该和线程池类似吧,


现在有些疑义的地方在于,创建socket的开销大吗?
并不是所有的对象用池来管理是好的,线程池也有适用场景。

如果管理的开销 远远大于了socket的创建开销,那就没必要了。

#4


创建socket也是个大开销的。。某种意义上说

#5


http://www.hacknp.cn/
这里面有一个“AsyncSelect模型QQ程序教程区 ”栏目

#6


引用 5 楼 wyx100 的回复:
http://www.hacknp.cn/
这里面有一个“AsyncSelect模型QQ程序教程区 ”栏目

要VIP才能访问.

回3楼的朋友,SOCKET也是一种内核对象,创建和销毁的开销都不小,还要进行特权级的切换
只是现在的电脑配置很高,低配置的就能感觉得到.

#7


引用楼主 sidyhe 的回复:
续上一个帖子:http://topic.csdn.net/u/20110312/00/c3863401-5100-4129-a838-17bb2312b869.html

实践证明重用SOCKET是可以实现的,当服务端主动关闭套接字的时候此SOCKET可以重用(完全的4次握手)

可从客户端关闭的时候,服务端的SOCKET总是处于CLOSE_WAIT状态,导致下一次AcceptEx失败.
……

LINGER可能导致closesocket后线程等待,也可能是直接被RST掉
如果你想快,就设置l_onoff=1;l_linger=0

#8


不行的,我都愁死了......

#9


close_wait状态 重新主动打开那个端口会失败
不过来自客户端的连接是会成功的
不信你试试.

#10


看过一些资料,好像tx的socket就是重用的,因为会经历几个过程:比如密码验证,登录……每个过程都会建立新的连接,为了确保服务器的高效率,它会采用你说的这种做法,重复性创建socket会浪费很多资源的

#11


冒昧的问一下,tx是什么???腾讯吗???
我需要的是服务端的重用,不是客户端的.

#12


调用DisconnectEx函数关闭链路,不要用closesocket

#13


就是不是closesocket,一个SOCKET反复用而已

#14


该回复于2011-03-23 09:05:02被版主删除

#15


Acceptex与Disconnectex 配对使用,可以达到服务器端Socket重用
Connectex与Disconnectex 配对使用,在被动关闭的情况下,可以达到客户端Socket重用

#16


http://blog.sina.com.cn/s/blog_759803690101a7ul.html
这个里面对socket池有比较清晰的解释

#1


你的重用的意思是,客户端关闭,服务器那边不把socket close 就继续用?
但我觉得这样不好吧?不太懂,来学习。

#2


是的,不用closesocket,断开之后继续用,在研究这方面.

#3


创建线程和关闭线程的开销大,于是有了线程池,
您的socket迟,如果能实现,原理也应该和线程池类似吧,


现在有些疑义的地方在于,创建socket的开销大吗?
并不是所有的对象用池来管理是好的,线程池也有适用场景。

如果管理的开销 远远大于了socket的创建开销,那就没必要了。

#4


创建socket也是个大开销的。。某种意义上说

#5


http://www.hacknp.cn/
这里面有一个“AsyncSelect模型QQ程序教程区 ”栏目

#6


引用 5 楼 wyx100 的回复:
http://www.hacknp.cn/
这里面有一个“AsyncSelect模型QQ程序教程区 ”栏目

要VIP才能访问.

回3楼的朋友,SOCKET也是一种内核对象,创建和销毁的开销都不小,还要进行特权级的切换
只是现在的电脑配置很高,低配置的就能感觉得到.

#7


引用楼主 sidyhe 的回复:
续上一个帖子:http://topic.csdn.net/u/20110312/00/c3863401-5100-4129-a838-17bb2312b869.html

实践证明重用SOCKET是可以实现的,当服务端主动关闭套接字的时候此SOCKET可以重用(完全的4次握手)

可从客户端关闭的时候,服务端的SOCKET总是处于CLOSE_WAIT状态,导致下一次AcceptEx失败.
……

LINGER可能导致closesocket后线程等待,也可能是直接被RST掉
如果你想快,就设置l_onoff=1;l_linger=0

#8


不行的,我都愁死了......

#9


close_wait状态 重新主动打开那个端口会失败
不过来自客户端的连接是会成功的
不信你试试.

#10


看过一些资料,好像tx的socket就是重用的,因为会经历几个过程:比如密码验证,登录……每个过程都会建立新的连接,为了确保服务器的高效率,它会采用你说的这种做法,重复性创建socket会浪费很多资源的

#11


冒昧的问一下,tx是什么???腾讯吗???
我需要的是服务端的重用,不是客户端的.

#12


调用DisconnectEx函数关闭链路,不要用closesocket

#13


就是不是closesocket,一个SOCKET反复用而已

#14


该回复于2011-03-23 09:05:02被版主删除

#15


Acceptex与Disconnectex 配对使用,可以达到服务器端Socket重用
Connectex与Disconnectex 配对使用,在被动关闭的情况下,可以达到客户端Socket重用

#16


http://blog.sina.com.cn/s/blog_759803690101a7ul.html
这个里面对socket池有比较清晰的解释