7

我正在使用TTCPBlockSocketTCP/IP 应用程序。问题是我无法确定连接何时丢失。

GetLastError返回 0
Read返回 0

但是即使应用程序已连接,我也会遇到这些值,因此我可以获取它如何在 TCP/IP 连接丢失时收到通知。

谢谢

4

3 回答 3

1

我想说,您可以使用该CanRead方法,将 0 传递给它的Timeout参数。此函数在内部select为套接字执行功能,并在发生错误时返回 False。仅使用此方法就足够了,因为如果您失去连接,该select函数将返回,并且它会导致该方法返回 False 作为结果。所以我认为,以这种方式检查套接字连接是否存在就足够了:SOCKET_ERRORCanRead

function IsSocketAlive(ASocket: TTCPBlockSocket): Boolean;
begin
  Result := ASocket.CanRead(0);
end;
于 2012-10-24T11:51:47.150 回答
1

正如 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;

我在我的项目中使用这种方式,所以我可以确认它有效。

于 2014-08-20T22:41:30.987 回答
0

我正在使用 kattunga 的答案,但在我的压力测试期间遇到了很多误报触发因素。我的假设是数据包有时会在 WaitingData 和 CanRead 条件之间到达服务器,导致服务器认为套接字已死。我改变了条件的顺序,问题就消失了。

function TTCPSynWorkThread.IsSocketDead(ASocket: TTCPBlockSocket): boolean;
begin 
  Result := (ASocket.Socket = INVALID_SOCKET) or (ASocket.CanRead(0) and (ASocket.WaitingData = 0));
end;
于 2021-08-03T16:21:34.857 回答