2013-03-12 143 views
17

我對Socket對象上的相關方法的聚寶盆頗感困惑,它應該關閉並清理套接字連接。考慮以下幾點:關閉和清理Socket連接的正確方法是什麼?

var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
socket.Connect("192.168.1.22", 8333); 
socket.Send(Encoding.UTF8.GetBytes("hello")); 

// now for the closing fun 
socket.Shutdown(SocketShutdown.Both); 
socket.Disconnect(false); 
socket.Close(); 
socket.Dispose(); 

此外,this guy說,要真正乾淨關閉連接,一個必須執行socket.Shutdown(SocketShudown.Send),然後等待對方迴應。

什麼是關閉,然後清理套接字連接的正確方法?

+0

那個人是對的。我認爲這取決於兩者之間的協議。如果您希望能夠繼續接收一段時間,那麼是的,您應該告訴其他人您的關機意圖,並說您將停止發送,但仍然可以接收。 – uriDium 2013-03-12 07:20:33

+0

「那個人」大部分是正確的,因爲我已經類似地模擬了我的服務器代碼。但是我相信只有在異步(非阻塞)套接字中才需要半關閉然後等待的方法。我相信在非阻塞套接字的情況下,您稱之爲「發送」,然後立即關閉,如果存在需要重新傳輸的數據包,則會出現數據丟失的一些邊緣條件。 – selbie 2013-03-12 08:40:29

+0

我對套接字服務器使用了混合方法。服務器將首先關閉連接並等待recv()返回0或錯誤以指示客戶端已完成。但是,我有一個定時器,每隔45秒週期性地關閉,以掃描和關閉自上次掃描後一直徘徊的任何半開連接。 – selbie 2013-03-12 08:42:23

回答

11

關閉插座關閉連接,並且關閉是圍繞處置的包裝方法中,所以一般

socket.Shutdown(SocketShutdown.Both); 
socket.Close(); 

應該足夠了。有人可能會爭辯說,Close實現可能會改變一天(因此它不再稱爲Dispose),並且在調用Close之後應該手動調用Dispose,但我懷疑這會發生,但我個人認爲:)

或者,考慮使用using yeh):

using (var socket = new Socket(...)) 
{ 
    .... 
    socket.Shutdown(SocketShutdown.Both); 
} 
相關問題