9

我想知道是否有人知道处理使用 Socket 对象和 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();

所有这些都是必要的还是矫枉过正?

4

3 回答 3

2

Socket不处置相关的NetworkStream. 我也确定了反光板。(一个分析 .NET dll 和 .NET 库的工具。很棒的工具。你必须在月底下载免费版本,然后才能完全商业化)。

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

Shutdown无论如何,您都必须调用,因为 if会刷新数据。否则,您可能会丢失数据。

于 2011-02-18T23:06:59.417 回答
1

两者都Socket实现StreamIDisposable因此您可以只调用.Dispose()每个对象。Dispose 方法应处理处置所需的关闭和其他操作。

this.stream.Dispose(); 
this.socket.Dispose(); 

例如,这是Dispose流类的反汇编方法:

public void Dispose()
{
    this.Close();
}
于 2011-02-18T22:46:49.127 回答
1

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

无论如何,恕我直言,最安全的方法是使用“使用”,它可以让你在安全的网站上 :)

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);
}
于 2011-02-18T22:55:44.243 回答