为什么IPAddress.Any需要连接到远程主机?

时间:2013-03-21 10:32:09

标签: c# tcp tcplistener

我正在c#中构建一个客户端服务器应用程序,其中server是远程主机。我的网络中有路由器和防火墙。

我的客户端代码是

hostSocket = new TcpClient();                
hostSocket.Connect(serverIp, serverPort);

我的服务器端代码是

eqListner = new TcpListener(IPAddress.Parse(eqIp), eqPort);

在这种情况下,我可以通过提供ip 127.0.0.1来连接同一台PC上的客户端,但是当我在网络中的另一台PC上运行服务器时无法连接。

然后我通过以下方式更改了服务器端代码:

IPAddress ipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];
IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, eqPort);
TcpListener eqListner = new TcpListener(ipLocalEndPoint);

但结果仍然相同。然后我再次改变了我的服务器端代码:

eqListner = new TcpListener(IPAddress.Any, eqPort);

这完全没问题。我读过IPAddress.Any的msdn,发现这个属性设置服务器监听所有网络接口上的客户端活动。

我的问题是为什么IPAddress.Any需要连接到远程主机?和其他功能无法连接?

提前致谢....

2 个答案:

答案 0 :(得分:0)

  

在这种情况下,我可以通过提供ip 127.0.0.1来连接同一台PC上的客户端,但是当我在网络中的另一台PC上运行服务器时无法连接

127.0.0.1是环回地址,始终是本地主机。当服务和客户端只在同一台机器上时,这很方便。

您最好编码服务以侦听所有接口,这样,如果服务器更改地址,您的应用程序就不需要更新或重新启动。

答案 1 :(得分:0)

问题可能在第一行。

IPAddress ipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];

如果它正在运行,它将获得主机的第一个ip。这可能是IPv6或本地主机地址。 如果您想收听特定地址,最好将其添加到project settings。它将存储在app.config中,您可以在不重新编译的情况下进行更改。