2013-03-21 70 views
0

我正在C#中构建一个客户端服务器应用程序,其中服务器是远程主机。我的网络中有路由器和防火墙。为什么IPAddress.Any需要连接到远程主机?

我的客户端代码

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需要连接到远程主机?和其他功能无法连接?

在此先感谢....

回答

0
在这种情况下,我能给予的ip 127.0.0.1在同一台PC连接的客户端,但是当我跑另一台PC服务器我的网络

在不能连接

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

你最好在编码服务上监听所有接口,这样如果服务器更改地址,则不需要更新或重新启动应用程序。

0

问题可能出现在第一行。

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

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

+0

我在问'IPAddress.Any'的重要性。无论如何感谢您的答案。 – 2013-03-21 10:52:26

+0

'IPAddress.Any'将接受来自任何接口的连接。这就是为什么它有效。如果您正在侦听AddressList [0],并且无法从主机外部访问它(因为您的网络中没有配置IPv6和IPv6,或者因为它是环回,...),所以客户端永远不会能够连接。 – 2013-03-21 11:24:31

+0

不,我只使用IP V.4 – 2013-03-21 11:38:12

相关问题