关闭TcpClient及其底层NetworkStream

时间:2014-10-08 08:17:07

标签: dispose tcpclient networkstream

我现在正在使用TCP协议为其通信协议开发服务器/客户端应用程序。我有两个关于TcpClient及其底层NetworkStream的问题。我在骂人,但找不到明确的答案

(1)如果我使用TcpClient.Close()方法关闭TcpClient,底层NetworkStream是否也会自动关闭?对于.Net framework 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方法再次获得这样的流吗?

感谢您的投入!

1 个答案:

答案 0 :(得分:0)

一般规则是你应该努力处理任何可支配资源,除非众所周知这样做没有任何好处(最好的例子是Task)。

如果您看到一个重要原因,您希望不处理TcpClient或配对NetworkStream:Reflector显示GetStream将基础套接字的所有权转移给{{ 1}}。但是,将两者中的任何一个都关闭并关闭套接字。

您可以安全地处置这两个中的一个,因为套接字是唯一保存的非托管资源。

这意味着您的第一个引用是文档错误。

我刚才所说的是从反编译源代码中获得的未记录的知识。我依靠这些知识感觉非常安全,因为这种行为已经存在了10年,并且出于兼容性原因永远无法改变。 Microsoft非常努力地不破坏用户代码。