c#重置套接字的最快方法

时间:2017-09-25 23:04:42

标签: c# sockets

当我收到错误发送或接收时,我使用此代码重置套接字。

try {
  socket.Shutdown(SocketShutdown.Both);
  socket.Close();
  socket.Dispose(); 
} catch(Exception) {
}
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(ep)

我想知道我是否可以跳过关机,关闭和处理,以便更快地重新连接?垃圾收集器最终会调用那些,对吗?

1 个答案:

答案 0 :(得分:1)

您的问题表明您对如何使用套接字有一些误解。

Shutdown()方法与Close()方法不同。它们都是必需的。 Shutdown()方法用于通知远程端点您已完成发送。一旦两端都关闭了套接字,然后就可以关闭套接字。不是之前。

Close()方法用于释放非托管资源,即.NET Socket类抽象的Windows套接字句柄。只有在正常关闭连接之后,或者在使用套接字发生异常之后才调用此方法(此时,套接字不再可用)。

您根本不需要致电Dispose()。它只是调用Close()方法。或者,请致电Dispose(),而不是致电Close()。要么没事。你不需要同时打电话。

确实,如果你既不调用Close()也不调用Dispose(),那么垃圾收集器可能会绕过来完成对象,它会为你处理它。但这并不能保证,不是什么时候会发生,甚至如果它将会发生。

请注意,如果您想更快地重新连接,则需要进行正常关闭,即使看起来更有效。如果您只是关闭套接字,或者在调用Shutdown()之后但在等待远程端点也关闭连接之前将其关闭,则套接字将处于等待状态,以防止重用该端口和套接字资源。重新启动连接状态并重新连接的最快方法是正确使用API​​

我总是建议那些刚接触套接字API的人阅读Winsock Programmer's FAQ。它不是为.NET用户编写的,但对于那些试图学习如何使用任何网络套接字API的人来说,几乎所有的信息都非常有用。