如何在.NET中重用socket?

我试图重新连接到我已断开连接的套接字但由于某种原因它不会允许它,即使我调用Disconnect方法并将参数“reuseSocket”设置为true。

_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); _socket.Connect(ipAddress, port); //...receive data _socket.Disconnect(true); //reuseSocket = true //...wait _socket.Connect(ipAddress, port); //throws an InvalidOperationException: 

套接字断开连接后,您只能异步重新连接,并且只能连接到不同的EndPoint。 必须在线程上调用BeginConnect,该线程在操作完成之前不会退出。

我究竟做错了什么?

您可以像这样设置套接字选项

 _socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontLinger, True) 

如果它不起作用,请尝试其他一些选项

 _socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontLinger, false) _Socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, True) _Socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 500) _Socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, Timeout) 

在阅读了Socket.Disconnect的MSDN文档后,我注意到可能导致您出现问题的内容。

如果需要在不先调用Shutdown的情况下调用Disconnect,则可以将名为DontLinger的SocketOption设置为false并指定非零超时间隔,以确保发送排队等待传出传输的数据。 断开然后阻塞,直到发送数据或直到指定的超时到期。 如果将DontLinger设置为false并指定零超时间隔,则Close会释放连接并自动丢弃传出的排队数据。

尝试设置DontLinger套接字选项并指定0超时或在调用disconnect之前使用Shutdown

您是否尝试在断开连接之后和Connect之前添加此行?

 client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

来自MSDN :

 // Release the socket. client.Shutdown(SocketShutdown.Both); client.Disconnect(true); if (client.Connected) Console.WriteLine("We're still connnected"); else Console.WriteLine("We're disconnected"); 

如果使用面向连接的协议,则可以使用此方法关闭套接字。 此方法结束连接并将Connected属性设置为false。 但是,如果reuseSocket为true,则可以重用套接字。

要确保在套接字关闭之前发送和接收所有数据,应在调用Disconnect方法之前调用Shutdown。

Socket.Shutdown方法等待,直到缓冲区中的所有数据都已发送或接收。 但是,如果我们只设置了逗留选项,则Socket将在某个超时间隔后关闭。