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;