一直以来都以为 127.0.0.1 和 0.0.0.0 都是表示本机IP 地址,直至上一次在C# 中写一个UDP 通信的程序时遇到了问题。
先上代码:
// 实名发送
IPEndPoint localIpep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 25555); // 本机IP,指定的端口号
udpcSend = new UdpClient(localIpep);
//
string message = "this is a UDP message";
byte[] sendbytes = Encoding.Unicode.GetBytes(message);
IPEndPoint remoteIpep = new IPEndPoint(IPAddress.Parse("192.168.1.x"), 10000); // 发送到的IP地址和端口号
udpcSend.Send(sendbytes, sendbytes.Length, remoteIpep);
上面的代码在执行到udpcSend.Send() 时会抛出异常:System.Net.Sockets.SocketException:“向一个无法连接的网络尝试了一个套接字操作。”
原因分析:
导致异常的地方,就是在指定本机IP 地址和端口号 localIpep 的值时,不能用127.0.0.1,而应该是0.0.0.0。
127.0.0.1是回送地址,协议立即返回不进行任何网络传输。
https://blog.csdn.net/u012814696/article/details/55098249
127.0.0.1 是一个环回地址,并不表示“本机”。0.0.0.0才是真正表示“本网络中的本机”。
在实际应用中,一般我们在服务端绑定端口的时候可以选择绑定到0.0.0.0,这样我的服务访问方就可以通过我的多个ip地址访问我的服务。 比如我有一台服务器,一个外网地址A,一个内网地址B,如果我绑定的端口指定了0.0.0.0,那么通过内网地址或外网地址都可以访问我的应用。但是如果我之绑定了内网地址,那么通过外网地址就不能访问。 所以如果绑定0.0.0.0,也有一定安全隐患,对于只需要内网访问的服务,可以只绑定内网地址。
上述代码是UDP 的客户端,也是一样的道理。