如何判断并清除无用的socket连接(100分)

  • 主题发起人 主题发起人 devilsniffer
  • 开始时间 开始时间
D

devilsniffer

Unregistered / Unconfirmed
GUEST, unregistred user!
使用listView做了一个远程电脑上线列表。用的是serversocket控件,如果有clientsocket连接过来,就会在listView上显示一个条信息,信息内容为IP和连接句柄。<br>现在有这样一种情况,如果clientsocket连接在断开以后,但是listview上的信息没有清除(已经确定连接断开,因为用netstat -an进行了查看,发现连接断开。)<br>如何把这些已经断开的连接在listview列表中判断并进行清除呢?而只是保留正常的一些连接。<br>也就是判断并清除listview列表中的一些无用连接信息,而只保留连接的。
 
发个确认消息不就可以了,如果没有回音就清除!
 
我不想发消息。如果连接过多,对每个发消息不好吧。有没有更好的判断方法。
 
用soket的keepalive 属性检测
 
建议你使用API函数,在socket中你可以设置一个套接字的连接属性。将属性设置成KEEPALIVE方式,这样网络会每个一定时间发送连接是否正常信息(使用SNIFFER可以看到)。当一个TCP的连接断开以后,函数RECV就会有返回值,这是你做相应的处理就可以了!<br>注意在DELPHI下使用KEEPALIVE方法比较麻烦,需要自定义类型和属性。<br>具体使用方法你去VCKBASE上找就可以找到。
 
有没有简单的方法,因为断开连接的用netstat -an查看的话是没有显示的。
 
检测一个TCP是否断开最方便,最及时的方法就是KEEPALIVE了,并且还不用修改太多的代码。
 
而我用的是控件,如何检测?
 
i := 0;<br> &nbsp;while (not sent) and (i &lt;= sskt.Socket.ActiveConnections - 1) do<br> &nbsp;begin<br> &nbsp; &nbsp;if not sskt.Socket.Connections.connected then<br> &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp;sskt.Socket.Connections.Close; //如果短线了,就关闭连接。<br> &nbsp; &nbsp; &nbsp;continue;<br> &nbsp; &nbsp;end;
 
或者你用就是发送数据的时候检测这个连接是否依然正常的判断方法。但是这样方法不能让你及时的知道连接是否已经断开。<br>及时检测的方法只能使用KEEPALIVE参数。
 
此类问题只有一种比较好的方法。就是超时设定,当通信正常就写入时间标签之后程序定时检测该时间标签与当前时间标签的差值。大于设定值就清除该连接。Gettickcount就很方便。另外如果用Indy的话也可以通过判断connected(是函数不是值)状态,通过定时写数据看是否有except就可以知道连接是否还存在。
 
我的笔记有个例子
 
后退
顶部