目录
一、发现问题:
今天调试别人代码,其中这样一个实现C#服务端代码,发现启动的服务端死活连接不上。
启动地址:
服务端C#实现代码:
public void BeginListening(string localIp, string localPort)
{
var host = Dns.GetHostEntry(Dns.GetHostName());
foreach (var ip in host.AddressList)
{
if (ip.AddressFamily == AddressFamily.InterNetwork)
{
//localIp = ip.ToString();
}
}
//Console.WriteLine("99999999999999999999999 "+ localIp);
//创建服务端负责监听的套接字,参数(使用IPV4协议,使用流式连接,使用Tcp协议传输数据)
socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
//获取Ip地址对象
IPAddress address = IPAddress.Parse(localIp);
//创建包含Ip和port的网络节点对象
IPEndPoint endpoint = new IPEndPoint(address, int.Parse(localPort));
//将负责监听的套接字绑定到唯一的Ip和端口上
socketWatch.Bind(endpoint);
//设置监听队列的长度
socketWatch.Listen(int.MaxValue);
//创建负责监听的线程,并传入监听方法
threadWatch = new Thread(WatchConnecting);
//设置为后台线程
threadWatch.IsBackground = false;
//开始线程
threadWatch.Start();
}
二、调试过程
1、首先连接0.0.0.0:10210、127.0.0.1:10210、以及主机ip地址都连接不上
2、分析代码:
//获取本地主机的名称,然后将其传递给 Dns.GetHostEntry() 方法,以获取主机相关的信息。
var host = Dns.GetHostEntry(Dns.GetHostName());
//遍历主机信息中的地址列表
foreach (var ip in host.AddressList)
{
/*注:会把主机所有ipv4地址都循环给localIp 赋值一遍,最后一次赋值即是locallp地址中保存的地址*/
//检查当前地址的地址族是否为 IPv4
if (ip.AddressFamily == AddressFamily.InterNetwork)//
{
//如果是 IPv4 地址,则将其转换为字符串并存储在 localIp 变量中
localIp = ip.ToString();
}
}
3.调试验证
三、分析原因
最终localIp中保存的是192.168.85.1(我的以太网地址),也就是服务端启动在这里,而我输入服务端连接地址为、无线网地址、、127.0.0.1、0.0.0.0。
四、解决办法
1.输入最后一个赋值的ip地址即可。
2.直接注释
/*var host = Dns.GetHostEntry(Dns.GetHostName());
foreach (var ip in host.AddressList)
{
if (ip.AddressFamily == AddressFamily.InterNetwork)
{
localIp = ip.ToString();
Console.WriteLine("99999999999999999999999 " + localIp);
}
}*/
//获取Ip地址对象
IPAddress address = IPAddress.Parse(127.0.0.1);
localIp赋值为127.0.0.1(本地访问)或(本地和外网都可访问)即可。
五、知识延伸
另:
0.0.0.0 和 127.0.0.1 是两个特殊的 IP 地址,它们有以下区别:
- 127.0.0.1:127.0.0.1 是本地回环地址,通常称为 “localhost”。
- 作用是让网络应用程序能够与本地计算机进行通信,而无需通过网络传输数据。只能从同一台计算机上访问,无法被外部网络访问。
- 开发和调试过程中,常用于本地测试和调试网络服务与本地主机进行通信。
- 0.0.0.0:表示绑定到所有可用的网络接口。
- 在服务绑定时使用,允许服务监听来自任何网络接口的连接请求。
- 可以接受来自本地和外部网络的连接。
- 用途:
- 127.0.0.1 用于本地测试和调试。
- 0.0.0.0 用于在开发环境中监听所有可用的网络接口。
- 适用范围:
- 127.0.0.1 适用于需要在本地计算机上运行服务的场景。
- 0.0.0.0 适用于需要在局域网和互联网上访问的场景。