2012-04-23 90 views
2

近一週我正在閱讀並試圖找到使用TCP客戶端檢查連接狀態的解決方案(使用套接字類) 在我的情況下,我有一個連接到服務器的TCP客戶端(它不受我控制),我不時要檢查連接狀態,並在必要時重新連接。 我已經閱讀了很多互聯網上的信息,但我沒有找到合適的解決方案。如何在VB.NET中使用TCP客戶端檢查TCP服務器(套接字)的連接狀態

簡而言之,這些是我在互聯網上找到並嘗試實施的方法。 但是不幸的是,我發現了一些TCP服務器關閉的情況,TCP客戶端仍在說連接

請問有人遇到過這個問題可以幫我嗎?使用輪詢

Function Connected() As Boolean 
    Connected = False 
    If (tcpSocket.Connected) Then 
     If ((tcpSocket.Poll(0, SelectMode.SelectWrite)) AndAlso (Not tcpSocket.Poll(0, SelectMode.SelectError))) Then 
      Dim b As Byte() = New Byte(1) {} 
      If tcpSocket.Receive(b, SocketFlags.Peek) = 0 Then 
       Return False 
      Else : Return True 
      End If 
     Else 
      Return False 
     End If 
    Else 
     Return False 

    End If 
End Function 

3,採用輪詢

從MSDN

Private Function IsConnected(tcpSocket As Socket) As Boolean 
    Dim blockingState As Boolean = tcpSocket.Blocking 
    IsConnected = False 
    Try 
     Dim tmp(0) As Byte 
     tcpSocket.Blocking = False 
     tcpSocket.Send(tmp, 0, 0) 
     Return True 
    Catch e As SocketException 
     If e.NativeErrorCode.Equals(10035) Then 
      Return True 
     Else : Return False 
     End If 
     ThrowError(e) 
    Finally 
     tcpSocket.Blocking = blockingState 
    End Try 
End Function 

2.Example

1.Example

Private Function Connect2() As Boolean 
     Connect2 = False 
     If tcpSocket.Poll(0, SelectMode.SelectRead) = True Then 
      Dim byteArray As Byte() = New Byte(1) {} 
      If (tcpSocket.Receive(byteArray, SocketFlags.Peek)) = 0 Then Connect2 = True 
     End If 
     Return Connect2() 
End Function 
+0

原則上沒有可靠的方法來知道連接是否仍然可用而不從遠程端接收值。中間的網絡可能只是一個黑洞,你永遠不知道沒有收到什麼東西。 – usr 2014-10-08 07:56:33

回答

0

系統往往通過實施處理這種問題「心跳「機制,客戶端定期向服務器發送」你還活着「的請求。是否有任何廉價的非破壞性請求可以定期發送給服務器,以便確保套接字實際上是活着的?

+0

老實說,我不知道...我也找到一個有關TCPAlive的方法http://social.msdn.microsoft.com/Forums/en-US/netfxnetcom/thread/d5b6ae25-eac8-4e3d-9782-53059de04628 /但我不知道如何使用它... – Operagust 2012-04-23 15:44:40

+0

你的服務器執行什麼功能?也許有一種「獲得狀態」的電話,你可以每隔一段時間做一次 – 2012-04-23 15:59:33

+0

因此,服務器是一個規模(有一個IP和端口)...我的TCP客戶端連接到規模,並試圖讀取一些數據...時不時我想檢查與量表的連接是否仍然打開... – Operagust 2012-04-23 16:17:51

0

這是我奮鬥了一段時間,從未真正找到一個全面解決方案。不幸的是,沒有100%可靠的方法,這就是爲什麼大多數系統實施「心跳」(正如Steve Townsend所述)。

我能得到的最接近的是像這樣(受內存從C#翻譯):

Public Function IsConnected() as Boolean 
    Try 
     Return tcpSocket <> Nothing AndAlso Not(tcpSocket.Poll(-1, SelectMode.SelectRead) _ 
       AndAlso tcpSocket.Available = 0) 
    Catch (ObjectDisposedException) 
     Return False 
    End Try 
End Function 

我不知道你的確切設置,但你提到你要連接到一個規模。也許你可以試着把它的重量定期作爲「心跳」的一種形式來讀取。

相關問題