帖子加分!我就不信没有高手!!

king_lanzhou 2005-04-27 04:53:07

同一帖子:http://community.csdn.net/Expert/topic/3964/3964292.xml?temp=.728161

1. 客户端TCP掉线后,在一段时间内未登录,我的服务器能检测出掉线并关闭与该客户端的连接。

2.但客户端TCP掉线后,若在一段时间内继续登录,那么我的服务器就不能检测出该客户端以前的掉线。

我想是不是因为前后两个连接的客户机的IP、端口都一样,导致无法检测?

还是因为新连接会继续重用以前的连接资源,这样就不需再释放?
...全文
324 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
think__ 2005-05-10
  • 打赏
  • 举报
回复
不知道你所指的重新connect,是用一个新的sock去连接,还是用原来的sock重新connect

而且,你的说明比较模糊,让别人难以回答。问问题时应尽量用比较准确的描述,掉线是指什么,是主动关闭客户程序?系统宕机崩溃?网络连接中断?重登陆是指什么?客户程序在什么时机重连接的?
king_lanzhou 2005-05-09
  • 打赏
  • 举报
回复
wo re
king_lanzhou 2005-05-09
  • 打赏
  • 举报
回复
to think__(过眼烟云) :
首先谢谢!

请楼主解释清楚客户端继续登陆是什么意思?是新创建一个SOCK重连接服务器,还是应用逻辑层面的登陆。
-------------------------------------------------------------------
也就是TCP的重新connect

我想知道:
但客户端TCP掉线后,若在一段时间内继续登录,那么我的服务器就不能检测出该客户端以前的掉线。
这是什么原因了?




think__ 2005-05-09
  • 打赏
  • 举报
回复

1. 客户端TCP掉线后,在一段时间内未登录,我的服务器能检测出掉线并关闭与该客户端的连接。

2.但客户端TCP掉线后,若在一段时间内继续登录,那么我的服务器就不能检测出该客户端以前的掉线。

我想是不是因为前后两个连接的客户机的IP、端口都一样,导致无法检测?

还是因为新连接会继续重用以前的连接资源,这样就不需再释放?
==========================================================================================
客户掉线(不如拨掉网线,一段时间后再重新插上),这种情况下,TCP/IP底层是无法知道的(在KEEP ALIVE时间内)物理连接异常的。

请楼主解释清楚客户端继续登陆是什么意思?是新创建一个SOCK重连接服务器,还是应用逻辑层面的登陆。

一个TCP连接由一个4元组唯一确定(客户IP,客户SOCK端口,服务器IP,服务SOCK端口)的。如果楼主说的重登陆是说客户端用一个新的sock来连接服务器,实际上就是一个完全的新的TCP连接,和原来的TCP连接没有任何关系!所以,对服务端来说,这是一个全新的连接,而原来的连接仍然存在着。

至于资源消耗,原来的连接sock仍然存在,但因为该连接上已无数据交互(假如客户端已没有使用原来的连接收发数据),CPU的占用可以忽略,至于内存,一个TCP连接占用的内存也是很少的,几乎不用考虑内存泄露。所以最需要考虑的是,该已不使用的TCP连接,在服务端仍占用了一个sock句柄,而一个进程内可支持的最大句柄数(文件描述符)是有限制的。所以应该要将该sock关闭,其实即便是正常检测到连接中断,也需要主动将sock关闭
king_lanzhou 2005-05-04
  • 打赏
  • 举报
回复
up
king_lanzhou 2005-04-30
  • 打赏
  • 举报
回复
to slone(slone):
估计这样不行,因为客户端是不停发登录包的,这样就会造成把正常的TCP连接关掉,并且会导致客户端一直在重复上线、下线。
在另一帖子里:http://community.csdn.net/Expert/topic/3964/3964292.xml?temp=.5155298
slone 2005-04-29
  • 打赏
  • 举报
回复
我觉得你问题的关键在于TCP 的主机识别上,对于每个应用的连接,都应该有一个类似SESSION 的标记,不过这个我也不太懂,提供一些参考意见.
king_lanzhou 2005-04-29
  • 打赏
  • 举报
回复
1. 客户端TCP掉线后,在一段时间内未登录,我的服务器能检测出掉线并关闭与该客户端的连接。

2.但客户端TCP掉线后,若在一段时间内继续登录,那么我的服务器就不能检测出该客户端以前的掉线。

我想是不是因为前后两个连接的客户机的IP、端口都一样,导致无法检测?

还是因为新连接会继续重用以前的连接资源,这样就不需再释放?
jglxgz 2005-04-28
  • 打赏
  • 举报
回复
我最关心:
1.资源是否释放?
2.是否会占用CPU?
我的select里会有这个socket的ID
gaoxianfeng 2005-04-28
  • 打赏
  • 举报
回复
2.但客户端TCP掉线后,若在一段时间内继续登录,那么我的服务器就不能检测出该客户端以前的掉线。

不应该重用吧?
accept时会用未分配的端口
你保持住断线前的那个socket 难道那个socket还能通信?
  • 打赏
  • 举报
回复
IP地址和端口一样并不等于资源就会重用吧.

这个IP地址和端口只是监听器的,真正双方进行通信时,会另外建立端口(不然,你想有多个客户的话,他们怎么可能同时连接上你的服务?)

所以,一般上来说只要断线就应该释放资源的.

但有可能系统采用了连接池的概念,即它会自动保存一断时间这个资源在连接池(不管是你主动关闭的,还是被动掉线的),只要客户在指定时间内重连,就会重新使用这个资源.

呵呵,不过这个概念是对于ADO对象,不知道是不是也适用于TCP啊 :D
slone 2005-04-28
  • 打赏
  • 举报
回复
1.资源是否释放?
这个得看具体情况,是系统崩溃还是程序崩溃,网线物理断接等同系统崩溃,系统崩溃C/S 之间不会有交互,所以SERVER 端不能收到端口信息,服务器端断开连接,即释放资源取决于TCP 连接的失效时间。
2.是否会占用CPU?
CPU 不一定会占用,内存一定会占用的
xinzhaolei 2005-04-28
  • 打赏
  • 举报
回复
关注ing!
king_lanzhou 2005-04-28
  • 打赏
  • 举报
回复
帮忙吧
suowei1979 2005-04-28
  • 打赏
  • 举报
回复
up
loveleijuforever 2005-04-28
  • 打赏
  • 举报
回复
socket在关闭后千万不能再生成一个一样的socket(端口一样)。不然就等着出问题把。
king_lanzhou 2005-04-28
  • 打赏
  • 举报
回复
up
sharkhuang 2005-04-28
  • 打赏
  • 举报
回复
client一般不绑定端口
king_lanzhou 2005-04-27
  • 打赏
  • 举报
回复
同一帖子:http://community.csdn.net/Expert/topic/3964/3964292.xml?temp=.728161
描述的问题是一样的,已有些回复。
各位高手可以看看!

mprogrammer 2005-04-27
  • 打赏
  • 举报
回复

IP基本可以确定一样,我想端口应该不好确定是否一样,这要看ROUTER的NAT的情况.

不管怎么样,检测断线的时候才能释放资源,要不就不释放!

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧