C#服务端连接不上问题

目录

一、发现问题:

 二、调试过程

三、分析原因

四、解决办法

五、知识延伸

一、发现问题:

今天调试别人代码,其中这样一个实现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 地址,它们有以下区别:

  1. 127.0.0.1:127.0.0.1 是本地回环地址,通常称为 “localhost”。
    • 作用是让网络应用程序能够与本地计算机进行通信,而无需通过网络传输数据。只能从同一台计算机上访问,无法被外部网络访问。
    • 开发和调试过程中,常用于本地测试和调试网络服务与本地主机进行通信
  2. 0.0.0.0:表示绑定到所有可用的网络接口。
    • 在服务绑定时使用,允许服务监听来自任何网络接口的连接请求。
    • 可以接受来自本地和外部网络的连接。
  3. 用途
    • 127.0.0.1 用于本地测试和调试。
    • 0.0.0.0 用于在开发环境中监听所有可用的网络接口。
  4. 适用范围:
    •    127.0.0.1 适用于需要在本地计算机上运行服务的场景。
    •    0.0.0.0 适用于需要在局域网和互联网上访问的场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值