TcpListener问题 - 重新绑定到具有不同本地地址的同一端口

时间:2009-09-21 12:27:33

标签: c# tcplistener

我正在尝试执行以下操作:仅侦听某些端口上的环回连接,然后开始侦听任何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会接受环回连接。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

Stop()方法不会关闭任何连接。因此,您最好绑定到Any接口,然后根据连接IP地址处理数据。

答案 1 :(得分:0)

该问题与连接客户端无关,但仅与绑定套接字一起侦听指定的IPAddress范围/端口。听“Any”包括收听“Loopback”,并且由于某些内容仍在侦听“Loopback”,因此侦听“Any”的尝试失败。

注释掉的近距离通话实际上正是这种情况下所需要的。这将停止侦听新连接,但不会关闭已接受的连接。

但是,可以调整此行为。有关详细信息,请参阅this MSDN page

(后代的答案可能是这个答案对于操作来说太迟了。)