2014-10-08 93 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年,并且出于兼容性原因决不能改变。微软很努力不会破坏用户代码。

相关问题