我有打开一个插座,作用在插座上的环,然后关闭套接字并重新启动。 然而,在第二次迭代我得到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)。 没有任何人有任何想法,我怎么能解决这个问题?

有帮助吗?

解决方案

我认为socket.Close()照顾了,但我想不会。在这种情况下,你需要使用:

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

您可以阅读更多有关套接字选项这里

其他提示

这是Windows上的已知问题,即使你关闭一个插座,还有一个WAITTIME释放资源之前回OS。

有一种方法可以手动设置在.NET中的一个插座WAITTIME,但它可能是一个更好的选择,重新审视你的设计,而不是要保持监听套接字打开,而不是关闭它,而是关闭新即Socket.Accept(期间创建插座);

scroll top