我有一个打开套接字的循环,作用于套接字,然后关闭套接字并重新启动。
但是,在第二次迭代中,我得到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)。 有没有人知道如何解决这个问题?
答案 0 :(得分:5)
我认为socket.Close()负责这一点,但我猜不是。在这种情况下,您需要使用:
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
您可以阅读有关套接字选项here的更多信息。
答案 1 :(得分:1)
这是Windows上的已知问题,即使您关闭了套接字,也会在资源释放回操作系统之前有一段等待时间。
有一种方法可以在.NET中手动设置套接字的等待时间,但是重新访问设计可能是更好的选择,而是保持监听器套接字打开,而不是关闭它,而是关闭新的在Socket.Accept();
期间创建的套接字