对.Net套接字生命周期感到困惑

对.Net套接字生命周期感到困惑,.net,sockets,.net,Sockets,我对.Net套接字的生命周期感到困惑,尤其是在即将结束的时候。根据MSDN,插座可以进行连接、断开、关闭、关闭和完成。但我有点困惑,我什么时候会选择执行这些操作,哪些发送FIN,哪些发送RST,哪些阻止新事件调用我的事件处理程序,等等。此外,由于Close释放了套接字的资源,我什么时候需要单独执行Finalize 提出我的问题是因为我一直在做 if (_TCPConn.Connected) { _TCPConn.Shutdown(SocketShutd

我对.Net套接字的生命周期感到困惑,尤其是在即将结束的时候。根据MSDN,插座可以进行连接、断开、关闭、关闭和完成。但我有点困惑,我什么时候会选择执行这些操作,哪些发送FIN,哪些发送RST,哪些阻止新事件调用我的事件处理程序,等等。此外,由于Close释放了套接字的资源,我什么时候需要单独执行Finalize

提出我的问题是因为我一直在做

      if (_TCPConn.Connected)
      {
          _TCPConn.Shutdown(SocketShutdown.Both);
          _TCPConn.Disconnect(true); 
      }
_TCPConn是我的插座,当我断开连接时,我得到了

不允许发送或接收数据的请求,因为套接字 之前的一次关闭已经在该方向关闭 召唤

…在我的事件处理程序中,因为数据仍然异步传入并触发处理程序。完成关闭似乎是解决这个问题的方法。但就在那时,我意识到我需要更好地理解这一点。另外,从这些不同的停止插座的方法中,有哪些对称的方法使插座恢复活力


如果有人能指出一篇描述.Net套接字生命周期的好文章或资源,这将是对这个问题的一个很好的回答。

您在这里混淆了一些东西。BegindConnect是异步的,不会阻止断开连接的线程版本。因此,使用哪一个取决于在断开连接完成之前是否可以阻塞线程

在调用close之前,必须在面向连接的套接字上调用Shutdown。在非面向连接的套接字上似乎不需要它

关闭和处置是等效的。当您不再需要套接字并且可以释放它所拥有的资源时,您应该调用其中一个

你从不打电话;如果您没有正确地处理套接字,GC将完成此操作。但这并不是套接字所独有的,任何实现IDisposable函数的方法都是一样的。MS还建议创建一个名为Close的方法,如果该方法比Dispose更直观,那么可以打开文件和套接字,因此关闭它们是有意义的。然而,随着using语句的添加,我很少再使用显式Close方法了

我建议你多读一些关于使用的知识

我不确定是否有任何东西会发送重置;我认为FIN将被关闭/处置