C# 要关闭网络流,请调用stream.close或socket.Shutdown?

C# 要关闭网络流,请调用stream.close或socket.Shutdown?,c#,sockets,stream,networkstream,C#,Sockets,Stream,Networkstream,我想知道是否有人知道处理使用套接字对象和NetworkStream对象的类的最佳方法?该类有一个NetworkStream实例和一个用于创建NetworkStream的Socket实例 this.socket = new Socket( AddressFamily.InterNetwork, SocketType.Stream, Pro

我想知道是否有人知道处理使用套接字对象和NetworkStream对象的类的最佳方法?该类有一个NetworkStream实例和一个用于创建NetworkStream的Socket实例

this.socket = new Socket(
                           AddressFamily.InterNetwork,
                           SocketType.Stream,
                           ProtocolType.Tcp)
                        {
                            ReceiveBufferSize = 65536,
                            SendBufferSize = 150
                        };

this.socket.Connect(
                        new IPEndPoint(                                                                   
                              IPAddress.Parse(
                                          Properties.Settings.Default.MpsServer2),
                                          Properties.Settings.Default.MpsPort2));

this.stream = new NetworkStream(
                         this.socket, true);
在我的Dispose方法中,我应该这样做吗

this.stream.Close();
this.socket.Shutdown(SocketShutdown.Both);
this.socket.Close();

所有这些都是必要的还是过度使用?

Socket和
Stream
都实现了
IDisposable
,这样您就可以对每个对象调用
.Dispose()
。处置方法应处理处置所需的关闭和其他操作

this.stream.Dispose(); 
this.socket.Dispose(); 
例如,这是stream类中反汇编的
Dispose
方法:

public void Dispose()
{
    this.Close();
}

根据MSDN中的文档,调用stream.Close()“关闭当前流并释放与当前流关联的任何资源(如套接字和文件句柄)”,这告诉我stream.Close()也会处理套接字。不过,您仍然需要调用socket.Shutdown()

无论如何,我认为最安全的方法是使用“using”,它让你保持在安全的网站上:)


Socket
不处理关联的
NetworkStream
。我太激动了,不能肯定。(一个分析.NET DLL和.NET库的工具。很棒的工具。你必须在月底下载免费版本,然后它才能完全投入使用。商业版)

但是,根据和reflector,流将关闭套接字,但前提是它拥有套接字的所有权。您可以将其设置为重载构造函数中的第二个参数


在任何情况下都必须调用
Shutdown
,因为如果。如果不这样做,可能会丢失数据。

您无法在套接字上调用
Dispose
。仅
Close
。套接字IDisposable的实现是显式的,这意味着它没有“public”Dispose方法,您必须将套接字强制转换为IDisposable才能调用Dispose,例如((IDisposable)Socket)。Dispose()…使用(var Socket=new Socket()){..}将调用Dispose()我将此标记为正确答案,因为它有最多的文档。我想知道流的Dispose方法是否可以完成这项工作,但是似乎没有太多关于它将要做什么的信息。
using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
                        {
                            ReceiveBufferSize = 65536,
                            SendBufferSize = 150
                        };) {
  socket.Connect(
    new IPEndPoint(
      IPAddress.Parse(
        Properties.Settings.Default.MpsServer2), Properties.Settings.Default.MpsPort2));

  using (var stream = new NetworkStream(socket, true) {
    // do something with the stream here
  }

  socket.Shutdown(SocketShutdown.Both);
}