我正在使用TTCPBlockSocket
作为TCP / IP应用程序。问题是我无法确定何时连接丢失。
GetLastError
返回0
Read
返回0
但是,如果应用程序已连接,我会遇到这些值eaven因此我可以得到它如何在TCP / IP连接丢失时收到通知。
由于
答案 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;