TTCPBlockSocketTCP/IPアプリケーションに使用しています。問題は、接続がいつ失われたかを判断できないことです。
GetLastError
Read0を返します0を返します
しかし、アプリケーションが接続されている場合、これらの値に遭遇するので、TCP/IP接続が失われたときに通知する方法を取得できます。
ありがとう
TTCPBlockSocketTCP/IPアプリケーションに使用しています。問題は、接続がいつ失われたかを判断できないことです。
GetLastError
Read0を返します0を返します
しかし、アプリケーションが接続されている場合、これらの値に遭遇するので、TCP/IP接続が失われたときに通知する方法を取得できます。
ありがとう
つまり、パラメータCanReadに0を渡して、このメソッドを使用できTimeoutます。この関数は内部selectでソケットの関数を実行し、エラーが発生するとFalseを返します。接続が失われるとselect関数が返され、結果としてメソッドがFalseを返すため、このメソッドだけを使用するだけで十分です。したがって、この方法でソケット接続が有効かどうかを確認するだけで十分だと思います。SOCKET_ERRORCanRead
function IsSocketAlive(ASocket: TTCPBlockSocket): Boolean;
begin
Result := ASocket.CanRead(0);
end;
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;
私は自分のプロジェクトでこの方法を使用しているので、それが機能することを確認できます。