当前位置: 技术问答>linux和unix
高手支招:TCP掉线重新连接,资源的释放问题?
来源: 互联网 发布时间:2015-09-26
本文导语: 客户端TCP掉线后,在服务器未检测出掉线并关闭之前又连接上服务器了,我想问: 这时服务器对该客户端先前的连接是否已释放,还是就不需要释放?是否占用了资源? 请高手! | tcp的连...
客户端TCP掉线后,在服务器未检测出掉线并关闭之前又连接上服务器了,我想问:
这时服务器对该客户端先前的连接是否已释放,还是就不需要释放?是否占用了资源?
请高手!
这时服务器对该客户端先前的连接是否已释放,还是就不需要释放?是否占用了资源?
请高手!
|
tcp的连接的中断是可以检测到的,比如read()==0。
如果你说的资源是你自己给每个tcp连接分配的,那当然应该释放。
如果你说的资源是指tcp的系统资源的话,那你不用操心,因为tcp的连接是流连接,内部有机制判断连接是否正常,如果你的客户端断开重联,新连接和原来的连接已经没什么关系了,原来连接的资源会被超时释放,当然你server端还是应该close掉,因为你已经不能用它了,虽然它并不占你什么资源。
如果你说的资源是你自己给每个tcp连接分配的,那当然应该释放。
如果你说的资源是指tcp的系统资源的话,那你不用操心,因为tcp的连接是流连接,内部有机制判断连接是否正常,如果你的客户端断开重联,新连接和原来的连接已经没什么关系了,原来连接的资源会被超时释放,当然你server端还是应该close掉,因为你已经不能用它了,虽然它并不占你什么资源。
|
>>>>>>>>>2.但客户端TCP掉线后,若在一段时间内继续登录,那么我的服务器就不能检测出该客户端以前的掉线
-----------------
既然有重新登录的动作,有发登录包的请求,如果你之前保存有在线列表,对比一下不就知道这是断线重连了吗?
>>>>>>>>>我想是不是因为前后两个连接的客户机的IP、端口都一样,导致无法检测?
所谓的SOCKET,只不过是用一个ip+端口来决定的,如果照你说的重连后的ip端口不变,你就能重复使用这个SOCKET,无须管它是否重连过
我是写服务器的,也写过不少客户端,我没遇见过不能及时判断的情况。
>>>>>>我的业务量比较大,并且程序需要长期运行,我没有采用发心跳包的方法来检测,不希望TCP出现资源泄漏。
ip网络是个"尽力而为"和"无连接"的网络,尽管TCP(可以认为是程序员写的一个虚拟了"有连接网络"的管理器)帮我们做了一些处理,但是也不能认为是任何情况下都完全可靠,必要的KeepAlive动作,还是得发送处理,不管你的"服务器的业务量大,运行时间长"
-----------------
-----------------
既然有重新登录的动作,有发登录包的请求,如果你之前保存有在线列表,对比一下不就知道这是断线重连了吗?
>>>>>>>>>我想是不是因为前后两个连接的客户机的IP、端口都一样,导致无法检测?
所谓的SOCKET,只不过是用一个ip+端口来决定的,如果照你说的重连后的ip端口不变,你就能重复使用这个SOCKET,无须管它是否重连过
我是写服务器的,也写过不少客户端,我没遇见过不能及时判断的情况。
>>>>>>我的业务量比较大,并且程序需要长期运行,我没有采用发心跳包的方法来检测,不希望TCP出现资源泄漏。
ip网络是个"尽力而为"和"无连接"的网络,尽管TCP(可以认为是程序员写的一个虚拟了"有连接网络"的管理器)帮我们做了一些处理,但是也不能认为是任何情况下都完全可靠,必要的KeepAlive动作,还是得发送处理,不管你的"服务器的业务量大,运行时间长"
-----------------
|
IP地址和端口一样并不等于资源就会重用吧.
这个IP地址和端口只是监听器的,真正双方进行通信时,会另外建立端口(不然,你想有多个客户的话,他们怎么可能同时连接上你的服务?)
所以,一般上来说只要断线就应该释放资源的.
但有可能系统采用了连接池的概念,即它会自动保存一断时间这个资源在连接池(不管是你主动关闭的,还是被动掉线的),只要客户在指定时间内重连,就会重新使用这个资源.
呵呵,不过这个概念是对于ADO对象,不知道是不是也适用于TCP啊 :D
这个IP地址和端口只是监听器的,真正双方进行通信时,会另外建立端口(不然,你想有多个客户的话,他们怎么可能同时连接上你的服务?)
所以,一般上来说只要断线就应该释放资源的.
但有可能系统采用了连接池的概念,即它会自动保存一断时间这个资源在连接池(不管是你主动关闭的,还是被动掉线的),只要客户在指定时间内重连,就会重新使用这个资源.
呵呵,不过这个概念是对于ADO对象,不知道是不是也适用于TCP啊 :D
|
在客户端掉线的情况下,服务器端资源当然没有释放,因为释放不释放在于代码的调用,也就是关闭套接字的动作.其实服务器软件都有超时处理功能,如果在规定时间内没有收到客户端回溃数据,就认为是掉线,关闭套接字!
|
http://community.csdn.net/Expert/topic/3945/3945333.xml?temp=.8731501
类似有个帖子 你看看
如果能检测到掉线 再加上超时设定 能够显示释放资源
如果没检测掉线 不关闭 连接 资源不释放
但你关闭连接后 也要系统去调度 可能会出现 你关闭后过一会儿才释放的现象