我正在使用
TTCPBlockSocket
来开发TCP/IP应用程序。问题在于我无法确定连接何时丢失。
GetLastError
返回0
Read
返回0
即使应用程序已连接,我仍会遇到这些值,因此我该如何被通知TCP/IP连接何时丢失。
谢谢
TTCPBlockSocket
来开发TCP/IP应用程序。问题在于我无法确定连接何时丢失。
GetLastError
返回0
Read
返回0
即使应用程序已连接,我仍会遇到这些值,因此我该如何被通知TCP/IP连接何时丢失。
谢谢
function IsSocketAlive(ASocket: TTCPBlockSocket): Boolean;
begin
Result := (ASocket.Socket = INVALID_SOCKET) or ((ASocket.WaitingData = 0) and ASocket.CanRead(0));
end;
我之前使用了kattunga的答案,但在进行压力测试时遇到了很多误报触发。我的假设是,在等待数据和可读条件之间,有时会出现数据包到达服务器的情况,导致服务器认为套接字已经死亡。 我改变了条件的顺序,问题就解决了。
function TTCPSynWorkThread.IsSocketDead(ASocket: TTCPBlockSocket): boolean;
begin
Result := (ASocket.Socket = INVALID_SOCKET) or (ASocket.CanRead(0) and (ASocket.WaitingData = 0));
end;
CanRead
函数调用。该函数内部调用InternalCanRead
,该函数执行Winsockselect
函数。如果发生任何错误,则CanRead
函数返回False。 - TLama