2013-11-01 180 views
1

我有一個應用程序需要通過特定端口將數據流傳輸到服務器。當應用程序啓動時,它會執行一些檢查,網絡連接,可訪問主機等等。我希望它也檢查端口以確保它能夠接收數據。關閉套接字?

我有這樣的代碼:

Private Function CheckPort(ByVal Host As String) As Boolean 

    Dim IPs() As IPAddress = Dns.GetHostAddresses(Host) 
    Dim s As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) 

    s.Connect(IPs(0), <port # removed>) 

    If s.Poll(-1, SelectMode.SelectWrite) Then 
    Return True 
    End If 

    Return False 

End Function 

代碼工作很好,但我擔心的是通過執行檢查我可能會無意中阻止後續消息從應用程序到達港口。執行此檢查是否會干擾要發送給主機的實際數據?在返回函數之前,我應該使用s.close()來關閉套接字嗎?

回答

1

我主要是同意CodeCaster的響應。 如果說服務器是越野車,也可能是後你幾分鐘檢查端口的連接,連接中斷,甚至服務器關閉。 如果您仍然想這樣做,以減少讓用戶寫一些消息後不能被髮送的風險的一種手段,這將是遵循不錯的辦法。另一種方法是,您可以將數據保存爲本地草稿或其他位置,以便稍後在服務器可用時發送。

現在,轉到您的代碼: 您正在函數CheckPort中打開一個連接,所以當函數完成時,您將失去對s,即打開的套接字的任何引用。在C中,你會有資源泄漏;在Java中,垃圾收集器將負責處理Socket並關閉它。我不知道它是如何在VB中,但我離開函數之前關閉該套接字。無論如何這是一種健康的做法。

此外,當您準備好發送數據時,如果您丟失對開放套接字的引用或關閉套接字,您將無法在同一連接上執行此操作(除非VB有任何技巧我不知道)。你將不得不打開一個新的連接來發送數據。不要擔心,即使您之前做過檢查,您也可以做到。服務器會將其視爲不同的連接,可能來自不同的源端口(或者,如果先前關閉了連接,則取決於操作系統)。

+0

感謝徹底的迴應,rodolk。我會記住這些建議。在我退出函數之前,我會繼續關閉套接字,以防萬一。 – Seth

1

檢查連接之前,一個端口是打開它之前驗證文件的存在是有用的:不盡然。

該文件可以在檢查和孔之間被刪除,並且您的插座可以被關閉的原因有多種。

只需連接和寫入,它會拋出一個適當的異常時,它不會工作。

+0

感謝您的回覆。我理解你的觀點,但我仍然希望繼續檢查,因爲如果有任何問題,我希望能夠立即通知用戶,以便他們能夠追求其他選擇。我與之通信的服務器相當麻煩,我不希望人們經歷準備上傳的麻煩,只是爲了發現問題是離線的。 – Seth