2012-10-24 63 views
7

我正在使用TTCPBlockSocket作爲TCP/IP應用程序。問題是我無法確定連接何時丟失。Delphi + Synapse:如何檢查我是否仍然連接

GetLastError返回0
Read返回0

但我遇到這些值eaven如果應用程序連接,所以我可以得到它怎麼能當TCP/IP連接丟失,我得到通知。

感謝

+0

我會說['CanRead'](http://synapse.ararat.cz/doc/help/blcksock.TBlockSocket.html#CanRead)函數調用將0作爲'Timeout'參數傳遞給你尋找。此函數內部調用執行Winsock ['select'](http://msdn.microsoft.com/en-us/library/windows/desktop/ms740141(v = vs.85).aspx)函數的'InternalCanRead'。如果發生任何錯誤,CanRead函數將返回False。 – TLama

+1

@TLama我會盡力感謝。 – opc0de

+0

@TLama您的回答讓我走向了正確的路徑,如果TCPBlockSocket.CanRead(0)和TCPBlockSocket.WaitingData = 0斷開連接:= true,必須滿足以下條件才能檢查它是否斷開連接。你可以張貼這個答案讓我接受 – opc0de

回答

1

我會說,你可以使用CanRead方法,將0至其Timeout參數。該函數在內部爲套接字執行select函數,並在發生錯誤時返回False。僅使用此方法就足夠了,因爲如果丟失連接,select函數將返回SOCKET_ERROR,並且會導致CanRead方法返回False。所以我認爲,這足以檢查套接字連接活着是這樣的:

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

Nope不足以自己測試 – opc0de

+0

WaitingData方法(如您所添加的)會返回網絡輸入緩衝區中未決數據的數量,如果該內部ioctlsocket函數調用沒有失敗, 'SOCKET_ERROR'並且在連接已經丟失的時候返回待處理的數據量,那麼它不能反映你的需求。或者我錯了? (不幸的是,我現在無法測試它) – TLama

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; 

我在我的項目中使用這種方式,所以我可以確認它的工作原理。

+0

如果拔下網線,它是否按預期工作? – mjn