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)
,然後等待對方迴應。
什麼是關閉,然後清理套接字連接的正確方法?
那個人是對的。我認爲這取決於兩者之間的協議。如果您希望能夠繼續接收一段時間,那麼是的,您應該告訴其他人您的關機意圖,並說您將停止發送,但仍然可以接收。 – uriDium 2013-03-12 07:20:33
「那個人」大部分是正確的,因爲我已經類似地模擬了我的服務器代碼。但是我相信只有在異步(非阻塞)套接字中才需要半關閉然後等待的方法。我相信在非阻塞套接字的情況下,您稱之爲「發送」,然後立即關閉,如果存在需要重新傳輸的數據包,則會出現數據丟失的一些邊緣條件。 – selbie 2013-03-12 08:40:29
我對套接字服務器使用了混合方法。服務器將首先關閉連接並等待recv()返回0或錯誤以指示客戶端已完成。但是,我有一個定時器,每隔45秒週期性地關閉,以掃描和關閉自上次掃描後一直徘徊的任何半開連接。 – selbie 2013-03-12 08:42:23