0

我有一个循环打开一个套接字,作用于套接字,然后关闭套接字并重新启动。但是,在我得到的第二次迭代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);

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

现有连接被远程主机强行关闭
   在 System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult)
   在 Poderosa.PortForwarding.SynchronizedSocket.EndReceive(IAsyncResult ar)
   在 Poderosa.PortForwarding.Channel.OnSocketData(IAsyncResult 结果)

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

4

2 回答 2

5

我以为 socket.Close() 会解决这个问题,但我猜不是。在这种情况下,您需要使用:

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

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

于 2009-03-13T17:36:57.007 回答
1

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

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

于 2009-03-13T17:35:21.283 回答