当有多个clientsocket连到serversocket时,当其中一个不正常退出时发生错误!(100分)

  • 主题发起人 主题发起人 wzisme
  • 开始时间 开始时间
W

wzisme

Unregistered / Unconfirmed
GUEST, unregistred user!
当有多个clientsocket连到serversocket时,当其中一个不正常退出时serversocket仍然
认为对方还连在上面,请问怎样去刷新?当你向它发送信息时出错,怎样让他不出错呢?
 
ClientSocket1的Error事件中,将ErrorCode=0设为0即可
 
用select试试看,第一个参数填要测试的客户端连接的SocketHandle,第二个参数填超时
的时限,如果返回值为0就可判断客户端已经断开了。前提是在OnClientConnect事件中记录
各个客户端连接的SocketHandle。

uses WinSock
function RecvTimeOut(fd: Cardinal; sec: Word):Integer;
var
fs: TFDSet;
timeout: TTimeVal;
n: Integer;
begin
FD_ZERO(fs);
FD_SET(fd, fs);
timeout.tv_sec := sec;
timeout.tv_usec := 0;
n := Select(fd+1, @fs, nil, nil, @timeout);
Result := n;
end;
 
对于nonBlock方式
要重载 onErrorEvent 事件,然后在该事件重屏蔽错误码就可以了
socket.onErrorEvent := onMaybeError;

对于Block方式
需要调用Waitfordata进行检测。
 
我想是让它刷新serversocket的连接者
 
当对方clientsocket不正常断开时,都会在serversocket中发生errorcode=10054的错误,
我知道只要把errorcode改为0就可以了,但是我的意思不是这个,我是说这时serversocket
的ActiveConnections的数目没变,虽然对方不正当断开了,我想知道怎样刷新它,就是说我
用serversocket1.socket.connections[x].close时,仍然出错!
 
你就不用管他,系统一会会自己关闭这个连接的,
 
只是你在发送数据之前要判断
socket.handle是不是无效的
 
算了,我自己解决了
 
你在使用serversocket1.socket.connections[x].close时,应该先检测一下所用
的SocketHandle是否处于在用状态。如果正常,可以操作,否则不能进行这项操作。

如Sachow所说,这样的做法你需要在前面的工作中保存所连接上的SocketHandle。
 
对头,server会在处理了错误事件后自动关闭这个连接。
 
多人接受答案了。
 
后退
顶部