2014-01-09 63 views
0

我對.Net套接字生命週期感到困惑,特別是在最後的結尾。根據MSDN(http://msdn.microsoft.com/en-us/library/system.net.sockets.socket_methods%28v=vs.110%29.aspx),套接字可以執行BeginDisconnect(),Disconnect(),Shutdown(),Close()Finalize()。但我有點困惑時,我會選擇做各的這些,哪些發送FIN,哪些發送RST,哪些防止打電話給我的事件處理程序,等等。而且,新的事件,因爲關閉()釋放套接字的資源,我何時需要單獨完成一個Finalize()對.Net套接字生命週期感到困惑

我的問題有人提出,因爲我一直在做一個

 if (_TCPConn.Connected) 
     { 
      _TCPConn.Shutdown(SocketShutdown.Both); 
      _TCPConn.Disconnect(true); 
     } 

(_TCPConn是我的插座),一旦我做了斷開()我得到

請求發送或接收數據不允許的,因爲插座 已經在這個方向與以前的關機 電話關機

...在我的事件處理程序中,因爲數據仍然異步進入並觸發處理程序。做一個關閉()似乎是解決這個問題的方法。但那是當我意識到我需要更好地理解這一點的時候。另外,從這些阻止它的不同方法使套接字恢復生機的對稱方法是什麼?

一個很好的回答這個問題是,如果有人能指出的好文章或資源描述的.Net插座生命週期。

回答

0

你在這裏混淆了一些東西。 BeginDisconnect是Disconnect的異步(不會阻塞你的線程)版本。那麼你使用哪一個取決於你是否可以阻止你的線程,直到斷開連接完成。

關機必須在面向連接的插座,你調用close之前被調用。它似乎並不需要在非面向連接的套接字上。

Close和Dispose是等效的。當你不再需要socket時,你應該調用其中任何一個,並且釋放它所擁有的資源。

你永遠不會調用Finalize;這是由GC完成的,如果你沒有正確處理你的套接字。但是,這不是套接字所獨有的,任何實現IDisposable功能的方法都是一樣的。 MS還建議創建一個名爲Close的方法,如果這比Dispose更直觀(文件和套接字可以打開,所以它們可以關閉是有意義的)。然而,隨着使用語句的添加,我很少再使用顯式的Close方法。

我建議你多使用IDisposable讀了。

我不知道任何事情都會發送一個復位;我認爲FIN將在Close/Dispose上發送。