TClientSocket异常断开问题,希望高手解答(tcp问题),嗷嗷难(好像至今大富翁们全都解决不了) (50分)

  • 主题发起人 主题发起人 tscc
  • 开始时间 开始时间
T

tscc

Unregistered / Unconfirmed
GUEST, unregistred user!
我知道用 clientsocket 和seversocket 能实现在服务器端得到
连接到服务器的客户机列表,但客户端程序非正常退出时,如非正常关机,断电,拔网线等情况时,
在服务器端程序的 Seversocket 中不会引发 onerror,ondisconnect 事件,
即 seversocket 的连接不会更新,除非seversocket 向已断线的客户端发
信息才会引发 onerror 事件, 客户端是别人提供的硬件,要作修改是不可能的了,只能在服务器端进行捕捉,不肯能要求人家专门为我们修改,谢谢!:)

 
我以前也有你这样的想法,可后来“认清了形势”,网络可不像内存到硬盘那么可靠,数据在传输中既有可能“光荣了”,幸好,现成的TCP/IP可用,省了不少心。可连接状态不是你说了算的,得网络链路上成千上万的路由、交换机、光纤转发接收等等设备说了算。如果要他们不停地汇报自己的“健康状态”,光这些信息就可以让网络瘫痪。还是老老实实地发“心跳测试”吧!
 
可是客户端是别人提供的,要作修改是不可能的了,只能在服务器端进行捕捉,(自力更生呀,难),求各位大虾不要保守啦,帮帮小弟,我在这里给大家作揖啦
 
masm的回答应该能说明问题了,恐怕别无他法。
 
to masm,ylong.com:
可是客户端是别人提供的硬件,要作修改是不可能的了,只能在服务器端进行捕捉,不肯能要求人家专门为我们修改


 
你可以采用Indy Tcp Server呀。它好像可以检测到客户端断开连接了吧。[:D]
 
"除非seversocket 向已断线的客户端发
信息才会引发 onerror 事件, 因此需要用 timer 控件 向客户端不断的
尝试发信息,才能引发断线的客户端引起的 onerror 事件,从而加入代码
得出更新的客户端列表"


恐怕没有更好的方法了。
 
自己发心跳消息,是最简单的方式了

既然你要发数据包,就定义一个比较简单的包,不就可以了
 
自己处理心跳.
 
就按前面朋友说的给客户端发送查询包就行了,虽然客户端可能不会处理你的包,但足以使TCP连接机制检测到客户端已经断开连接。前提是你发的查询包不至于使客户端程序异常。
 
to :叮叮当当

请问怎样发送查询包合适呢,是sendtext吗,我以前也这样试过,可是大概要等几分钟才会触发error事件,还有什么更好的方法吗,请帮帮忙
 
tcp连接本来就是要求在断开后不检测状态的。因此唯一的方法就是写握手协议,也就是所谓的一段时间发消息来判定连接是否断开。
 
to:fengfan

那我该怎么办,难道非要等上几分钟,才提示连接已中断吗?有没有及时点的办法
 
一般是用时钟来定时检测连接状态的吧,间隔长短可根据实际情况自己定,定得太短太频繁
当然是不行的,定得太长也没必要。
 
问一下楼主:有必要区分一段时间的空闲和断开么?
有什么软件上的意义???
 
为什么一定要发送数据才能得到连接是否断开,读数据一样能发现!如果你不能修改客户端,往客户端发数据可能导致客户端工作紊乱,我建议你定时从客户端读数据,并设置超时检查,如果返回的错误不是WSAETIMEDOUT,就表示对方已经牺牲了。
 
to :乡村月光
能请您详细的教一下吗
 
发送“心跳测试”,onerror 事件BU 捉哪个IP无效。
 
用 timer 控件发消息看返回值试吧!虽然苦一点,但也是没办法中的办法!
 
你不是已经收过客户端的消息了吗,间隔超过xxx时间还没收到新消息,批准它886
 
后退
顶部