当我收到错误发送或接收时,我使用此代码重置套接字。
try {
socket.Shutdown(SocketShutdown.Both);
socket.Close();
socket.Dispose();
} catch(Exception) {
}
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(ep)
我想知道我是否可以跳过关机,关闭和处理,以便更快地重新连接?垃圾收集器最终会调用那些,对吗?
答案 0 :(得分:1)
您的问题表明您对如何使用套接字有一些误解。
Shutdown()
方法与Close()
方法不同。它们都是必需的。 Shutdown()
方法用于通知远程端点您已完成发送。一旦两端都关闭了套接字,然后就可以关闭套接字。不是之前。
Close()
方法用于释放非托管资源,即.NET Socket
类抽象的Windows套接字句柄。只有在正常关闭连接之后,或者在使用套接字发生异常之后才调用此方法(此时,套接字不再可用)。
您根本不需要致电Dispose()
。它只是调用Close()
方法。或者,请致电Dispose()
,而不是致电Close()
。要么没事。你不需要同时打电话。
确实,如果你既不调用Close()
也不调用Dispose()
,那么垃圾收集器可能会绕过来完成对象,它会为你处理它。但这并不能保证,不是什么时候会发生,甚至如果它将会发生。
请注意,如果您想更快地重新连接,则需要进行正常关闭,即使看起来更有效。如果您只是关闭套接字,或者在调用Shutdown()
之后但在等待远程端点也关闭连接之前将其关闭,则套接字将处于等待状态,以防止重用该端口和套接字资源。重新启动连接状态并重新连接的最快方法是正确使用API 。
我总是建议那些刚接触套接字API的人阅读Winsock Programmer's FAQ。它不是为.NET用户编写的,但对于那些试图学习如何使用任何网络套接字API的人来说,几乎所有的信息都非常有用。