如果你从不打电话给Socket.EndConnect会怎么样?

时间:2011-01-17 09:44:43

标签: .net sockets

使用.Net 4.0。我有一些代码尝试使用BeginConnect和回调打开连接。如果用户试图在接下来的几分钟内停止编程,我会尝试断开连接。此时,我设置了一个标志,指示是否需要从回调中调用EndConnect。如果该标志设置为false,我跳过EndConnect,因为无论如何套接字都已被删除。

此时用户可以立即尝试再次连接。我不认为这发生了,以防万一。现在创建一个新套接字并再次调用BeginConnect。

永远不要调用EndConnect方法吗?

1 个答案:

答案 0 :(得分:3)

在所有情况下(除了一个 [1] ),对BeginZZZ的调用都需要匹配的EndZZZZ

否则,非托管资源将被泄露,很可能行动ZZZZ将无法正确完成 - 可能会在以后破坏ZZZZ的进一步使用。

套接字非常强大,可以防止滥用(IP堆栈必须处理网络故障和数据包乱序),但这并不是一种好的做法。

如果您使用标记来跟踪“关闭”,最好拨打EndConnect然后立即关闭套接字。在所有连接本身都失败后,不需要断开连接(EndConnect抛出SocketException)。类似的东西:

mySocket.BeginConnect(address, port, ia => {
  if (shuttingDown) {
    try {
      mySocket.EndConnect(ia);
      mySocket.BeginDisconnect(false, iaa = {
        try {
          mySocket.EndDisconnect(iaa);
        } catch (Exception) { /* Ignore */ }
      }, null);
    } catch (SocketException) { /* Ignore */ }
  } else {
    // Normal connection handling
  }
}, null);

还使用异步断开连接以避免阻塞。


[1] WinForms中的异常为Control.BeginInvoke,其中明确记录了异常。