如何在.NET中重用socket?

时间:2010-04-23 13:41:28

标签: c# .net sockets network-programming

我正在尝试重新连接到已断开连接的套接字但由于某种原因它不会允许它,即使我使用参数“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必须   在不会退出的线程上调用   直到操作完成   完成。

我做错了什么?

4 个答案:

答案 0 :(得分:4)

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

  

如果您需要在不先调用Shutdown的情况下调用Disconnect,则可以将名为SocketOptionDontLinger设置为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将在某个超时间隔后关闭。