如何解决这个SocketException

时间:2009-03-13 17:29:50

标签: c# .net-3.5 socketexception

我有一个打开套接字的循环,作用于套接字,然后关闭套接字并重新启动。 但是,在第二次迭代中,我得到SocketException,通常只允许使用每个套接字地址(协议/网络地址/端口)。
但是,套接字应该关闭,netstat -a并不表示我正在侦听该端口或任何东西。抛出异常的代码是:

_bindedLocalSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_bindedLocalSocket.Bind(new IPEndPoint(Util.ChannelProfileToListeningAddress(_profile), _profile.ListenPort));
_bindedLocalSocket.Listen(30);
_bindedLocalSocket.BeginAccept(new AsyncCallback(OnRequested), null);

但是,我认为罪魁祸首不是代码,就在我开始使用该代码之前,在我尝试关闭连接之前,我得到了这个:

An existing connection was forcibly closed by the remote host
   at System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult)
   at Poderosa.PortForwarding.SynchronizedSocket.EndReceive(IAsyncResult ar)
   at Poderosa.PortForwarding.Channel.OnSocketData(IAsyncResult result)

一旦我关闭程序并再次运行它,它可以使第一个连接正常,第二个连接正常(SocketException)。 有没有人知道如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

我认为socket.Close()负责这一点,但我猜不是。在这种情况下,您需要使用:

socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);

您可以阅读有关套接字选项here的更多信息。

答案 1 :(得分:1)

这是Windows上的已知问题,即使您关闭了套接字,也会在资源释放回操作系统之前有一段等待时间。

有一种方法可以在.NET中手动设置套接字的等待时间,但是重新访问设计可能是更好的选择,而是保持监听器套接字打开,而不是关闭它,而是关闭新的在Socket.Accept();

期间创建的套接字