关于SOCKET 的API问题?如何判断连接已经断开?(200分)

  • 主题发起人 主题发起人 jlcsx
  • 开始时间 开始时间
J

jlcsx

Unregistered / Unconfirmed
GUEST, unregistred user!
关于SOCKET 的API问题?如何判断连接已经断开?
使用API编写SOCKET客户端,在客户端如何检测客户端已经断开?
 
在SOCKET的连接上加个TRY EXCEPT看看
 
1:使用KEEPALIVE参数(这种方法最为及时)。
2:使用TRY方法,来检测!(不太好!)
 
没有办法
因为 TCP/IP 协议就是这么设计的

DCOM 是这么做的, 不停的发送 UDP 包 如果一定时间收不到相应就认为连接断了
 
楼上的谁说TCP/IP协议没有办法判断套接字断开了!
在WINDOWS中使用KEEPALIVE就可以的!
 
建议客户端和服务器端做一个握手协议
 
TCP Socket正常断开或非正常断开都会有通知的。
API里面可以用FD_CLOSE来判定断开,非正常断开会有
WSAECONNABORTED这样一标志到另一端。
你收标志做相应的处理就行了.
如下面用的是API WinSock2
基于事件选择模型的:
while (True) do
if Windows.SleepEx(100, False) = 0 then
begin
with XWinSock2.W2EnumNetwrokEvents(Fm_MainClient.Client.Socket,
Fm_MainClient.Client.hEvent, @Fm_MainClient.Client.NetWorkEvents) do
if Result then begin
case Fm_MainClient.Client.NetWorkEvents.lNetworkEvents of
FD_CLOSE: Fm_MainClient.DoCloseClient;
FD_READ: begin
if SocketInRecv(Fm_MainClient.Client.Socket) then
Fm_MainClient.OnClientRead(Fm_MainClient.Client);
end;
end;
end
else begin
//错误事件
Fm_MainClient.OnClientError(ErrorCode, ErrorMsg);
end;
if Application.Terminated or IsExit then Break;
end;

procedure TFm_MainClient.OnClientError(const ErrorCode: Integer; const ErrorMsg: PChar);
begin
case ErrorCode of//非正常断开WSAECONNABORTED
WSAECONNABORTED, WSAENETDOWN: DoCloseClient; //
WSAEINPROGRESS, WSAEINVAL, WSAENOBUFS:
AddMemoSocketLog(ErrorMsg);
end;
end;
 
后退
顶部