2014-10-08 91 views
1

我正在開發一個使用TCP協議的服務器/客戶端應用程序來實現其通信協議。我有兩個關於TcpClient及其底層NetworkStream的問題。我是goolging,但找不到明確的答案關閉TcpClient及其底層NetworkStream

(1)如果我使用TcpClient.Close()方法關閉TcpClient,底層NetworkStream是否也會自動關閉?對於.Net框架4.5在這裏(http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.getstream(v=vs.110).aspx)說:「當您通過發送和接收數據時,您必須關閉NetworkStream。關閉TcpClient不會釋放NetworkStream。」但是,對於.Net Framework 4.5,在這裏(「http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.close(v=vs.110).aspx」)表示「調用此方法(TcpClient.Close)最終將導致關聯的Socket關閉,並且還會關閉用於發送和接收數據的關聯NetworkStream如果有人創建了。「我現在很困惑。 (2)如果我保持我的TcpClient打開並連接,但我關閉/配置通過調用TcpClient.GetStream獲得的底層NetworkStream,我可以通過調用GetStream方法再次獲得這樣的流嗎?

謝謝您的輸入!

回答

0

一般的規則是,你應該盡力處理任何一次性資源,除非衆所周知這樣做沒有好處(最好的例子是Task)。

如果你看到一個顯著的原因,爲什麼你想不處置TcpClient或成對NetworkStream的:反射顯示底層插座到NetworkStreamGetStream所有權轉移。但處置兩者中的任何一個都會關閉並關閉套接字。

由於套接字是唯一的非託管資源,因此您可以安全地僅處理其中的一個。

這意味着您的第一個報價是文檔錯誤。

我剛剛說的是從反編譯源代碼中得到的無證知識。依靠這種知識我會感到非常安全,因爲這種行爲已經存在了10年,並且出於兼容性原因決不能改變。微軟很努力不會破壞用戶代碼。

相關問題