我正在使用TTCPBlockSocket
TCP/IP 应用程序。问题是我无法确定连接何时丢失。
GetLastError
返回 0
Read
返回 0
但是即使应用程序已连接,我也会遇到这些值,因此我可以获取它如何在 TCP/IP 连接丢失时收到通知。
谢谢
我正在使用TTCPBlockSocket
TCP/IP 应用程序。问题是我无法确定连接何时丢失。
GetLastError
返回 0
Read
返回 0
但是即使应用程序已连接,我也会遇到这些值,因此我可以获取它如何在 TCP/IP 连接丢失时收到通知。
谢谢
我想说,您可以使用该CanRead
方法,将 0 传递给它的Timeout
参数。此函数在内部select
为套接字执行功能,并在发生错误时返回 False。仅使用此方法就足够了,因为如果您失去连接,该select
函数将返回,并且它会导致该方法返回 False 作为结果。所以我认为,以这种方式检查套接字连接是否存在就足够了:SOCKET_ERROR
CanRead
function IsSocketAlive(ASocket: TTCPBlockSocket): Boolean;
begin
Result := ASocket.CanRead(0);
end;
正如 opC0de 所说,要检查客户端是否仍然连接,您需要同时检查 TCPBlockSocket.CanRead(0) 和 TCPBlockSocket.WaitingData = 0
function IsSocketAlive(ASocket: TTCPBlockSocket): Boolean;
begin
Result := (ASocket.Socket = INVALID_SOCKET) or ((ASocket.WaitingData = 0) and ASocket.CanRead(0));
end;
我在我的项目中使用这种方式,所以我可以确认它有效。
我正在使用 kattunga 的答案,但在我的压力测试期间遇到了很多误报触发因素。我的假设是数据包有时会在 WaitingData 和 CanRead 条件之间到达服务器,导致服务器认为套接字已死。我改变了条件的顺序,问题就消失了。
function TTCPSynWorkThread.IsSocketDead(ASocket: TTCPBlockSocket): boolean;
begin
Result := (ASocket.Socket = INVALID_SOCKET) or (ASocket.CanRead(0) and (ASocket.WaitingData = 0));
end;