我现在正在开发一个服务器/客户端应用程序,它的通信协议使用TCP协议。关于TcpClient及其底层NetworkStream,我有两个问题。我咕哝着,却找不到一个明确的答案。
(1)如果我使用TcpClient ()方法关闭TcpClient.Close,那么底层NetworkStream是否也会自动关闭?对于.Net Framework4.5 (http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.getstream(v=vs.110).aspx说,当您通过发送和接收数据时必须关闭NetworkStream。关闭TcpClient并不释放NetworkStream。)但是,对于.Net Framework4.5 ("http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.close(v=vs.110).aspx说,“调用此方法(TcpClient.Close) )将最终导致关联套接字的关闭,并将关闭用于发送和接收数据的关联NetworkStream (如果创建的话)。
(2)如果我保持TcpClient打开和连接,但关闭/处理通过调用TcpClient.GetStream获得的底层NetworkStream,则可以通过调用GetStream方法再次获得这样的流吗?
谢谢您的投入!
发布于 2014-10-08 08:33:43
一般规则是,您应该尽力处理任何可使用的资源,除非众所周知,这样做没有好处(最好的例子是Task)。
如果您看到了不处理TcpClient或配对NetworkStream:Reflector的一个重要原因,那么GetStream会将底层套接字的所有权转移给NetworkStream。但是,处理这两者中的任何一个将关闭并关闭套接字。
您可以安全地处理这两个中的一个,因为套接字是唯一持有的非托管资源。
这意味着您的第一个报价是文档错误。
我刚才说的是从反编译源代码中获得的无文档知识。依靠这些知识,我会觉得很安全,因为这种行为已经持续了10年,而且由于兼容性的原因,我永远不会改变。微软非常努力地不破坏用户代码。
https://stackoverflow.com/questions/26252175
复制相似问题