Delphi + Synapse:如何检查我是否仍然连接

时间:2012-10-24 09:00:54

标签: delphi synapse

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

GetLastError返回0
Read返回0

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

由于

3 个答案:

答案 0 :(得分:1)

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

function IsSocketAlive(ASocket: TTCPBlockSocket): Boolean;
begin
  Result := ASocket.CanRead(0);
end;

答案 1 :(得分: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;

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

答案 2 :(得分: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;