Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Delphi + Synapse: How to check if I am still connected

Tags:

delphi

synapse

I am using TTCPBlockSocket for a TCP/IP Application . The problem is that I can't determine when the connection is lost.

GetLastError returns 0
Read returns 0

But I encounter these values eaven if the application is connected so I can get it how can I be notified when the TCP/IP connection is lost.

Thanks

like image 957
opc0de Avatar asked Oct 24 '12 09:10

opc0de


2 Answers

I would say, you can use the CanRead method, passing 0 to its Timeout parameter. This function internally performs select function for the socket and returns False when an error occurs. It should be enough to use just this method since the select function returns SOCKET_ERROR if you lose the connection, and it causes the CanRead method return False as a result. So I think, it's enough to check if the socket connection is alive this way:

function IsSocketAlive(ASocket: TTCPBlockSocket): Boolean;
begin
  Result := ASocket.CanRead(0);
end;
like image 52
TLama Avatar answered Sep 25 '22 23:09

TLama


As opC0de says, to check if the client is still connected you need to both check TCPBlockSocket.CanRead(0) and TCPBlockSocket.WaitingData = 0

function IsSocketAlive(ASocket: TTCPBlockSocket): Boolean;
begin
  Result := (ASocket.Socket = INVALID_SOCKET) or ((ASocket.WaitingData = 0) and ASocket.CanRead(0));
end;

I'm using this way in my projects so I can confirm that it works.

like image 33
kattunga Avatar answered Sep 25 '22 23:09

kattunga