我正在尝试执行以下操作:仅侦听某些端口上的环回连接,然后开始侦听任何IP地址。 这是代码:
TcpListener l1 = new TcpListener(new IPEndPoint(IPAddress.Loopback, 12345));
l1.Start();
Socket s = l1.AcceptSocket();
Console.ReadKey();
//s.Close();
l1.Stop();
TcpListener l2 = new TcpListener(new IPEndPoint(IPAddress.Any, 12345));
l2.Start();
l2.AcceptSocket();
Console.ReadKey();
问题是如果客户端在侦听Loopback地址(l1)时连接,则当第二个侦听器(l2)开始侦听时,没有其他客户端可以连接到Loopback地址。那是为什么?
我注意到的另一件事是,如果我关闭所有连接到l1的客户端(标记的行),那么l2会接受环回连接。
有什么想法吗?
答案 0 :(得分:1)
Stop()方法不会关闭任何连接。因此,您最好绑定到Any接口,然后根据连接IP地址处理数据。
答案 1 :(得分:0)
该问题与连接客户端无关,但仅与绑定套接字一起侦听指定的IPAddress范围/端口。听“Any”包括收听“Loopback”,并且由于某些内容仍在侦听“Loopback”,因此侦听“Any”的尝试失败。
注释掉的近距离通话实际上正是这种情况下所需要的。这将停止侦听新连接,但不会关闭已接受的连接。
但是,可以调整此行为。有关详细信息,请参阅this MSDN page:
(后代的答案可能是这个答案对于操作来说太迟了。)