我正在尝试重新连接到已断开连接的套接字但由于某种原因它不会允许它,即使我使用参数“reuseSocket”设置为true来调用Disconnect方法。
_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必须 在不会退出的线程上调用 直到操作完成 完成。
我做错了什么?
答案 0 :(得分:4)
在阅读Socket.Disconnect的MSDN文档后,我注意到可能导致您出现问题的内容。
如果您需要在不先调用Shutdown的情况下调用Disconnect,则可以将名为SocketOption的DontLinger设置为
false
并指定非零超时间隔,以确保排队等待传出的数据发送传输。 断开然后阻塞,直到发送数据或直到指定的超时到期。如果将DontLinger设置为false并指定零超时间隔,则Close会释放连接并自动丢弃传出的排队数据。
尝试设置DontLinger
套接字选项并指定0超时或在调用disconnect之前使用Shutdown
。
答案 1 :(得分:4)
您可以像这样设置套接字选项
_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)
答案 2 :(得分:1)
您是否尝试在断开连接之后和Connect之前添加此行?
client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
答案 3 :(得分:0)
来自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将在某个超时间隔后关闭。