我正在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需要连接到远程主机?和其他功能无法连接?
提前致谢....
答案 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中,您可以在不重新编译的情况下进行更改。