ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C#获取局域网主机

2019-06-27 13:50:28  阅读:188  来源: 互联网

标签:string C# 主机 mo Contains 局域网 mServiceName


C#获取局域网主机

最近在做一个使用MSRDPClient来实现远程桌面功能,需要先判断一下该局域网主机是否在线,所以就需要获取一遍局域网主机。

首先获取本地IP地址,这里需要注意的是,要排除掉虚拟机的IP,实现代码如下:

 public List<string> GetLocalIPs()
{
    List<string> lstIp = new List<string>();
    ManagementClass mcNetworkAdapterConfig = new ManagementClass("Win32_NetworkAdapterConfiguration");
    ManagementObjectCollection moc_NetworkAdapterConfig = mcNetworkAdapterConfig.GetInstances();
    foreach(ManagementObject mo in moc_NetworkAdapterConfig)
    {
        string mServiceName = mo["ServiceName"] as string;
        if (!(bool)mo["IPEnabled"])
        {
            continue;
        }
        mServiceName = mServiceName.ToLower();
        if(mServiceName.Contains("vmnetadapter")
            || mServiceName.Contains("ppoe")
            || mServiceName.Contains("bthpan")
            || mServiceName.Contains("tapvpn")
            || mServiceName.Contains("ndisip")
            || mServiceName.Contains("sinforvnic"))
        {
            continue;
        }
        string mCaption = mo["Caption"] as string;
        string mMACAddress = mo["MACAddress"] as string;
        string[] mIPAddress = mo["IPAddress"] as string[];
        string[] mIPSubnet = mo["IPSubnet"] as string[];
        string[] mDefaultIPGateway = mo["DefaultIPGateway"] as string[];
        string[] mDNSServerSearchOrder = mo["DNSServerSearchOrder"] as string[];

        if(mIPAddress != null)
        {
            foreach(string ip in mIPAddress)
            {
                if(ip != "0.0.0.0")
                {
                    if(IPAddress.TryParse(ip, out IPAddress address))
                    {
                        if(address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)//排除IP6地址,根据实际情况排除
                        {
                            lstIp.Add(ip);
                        }
                    }
                }
            }
        }
        mo.Dispose();

    }
    return lstIp;
}

然后采用Ping主机,查看是否有返回,实现代码如下:

public void GetLANIps()
{
    this.count = 1;
    this.IsOk = false;
    this.IPHosts.Clear();
    string localHostIp = this.LocalIps[0];
    string ipDuan = localHostIp.Remove(localHostIp.LastIndexOf('.'));
    
    byte[] bys = Encoding.UTF8.GetBytes("hello");
    for (int i = 1; i <= 255; i++)
    {
        string pingIp = $"{ipDuan}.{i}";
        Ping ping = new Ping();
        ping.PingCompleted += Ping_PingCompleted;
        ping.SendAsync(pingIp, 200, bys);
    }
}

private void Ping_PingCompleted(object sender, PingCompletedEventArgs e)
{
    if(this.count++ == 255)
    {
        this.IsOk = true;
    }
    if (e.Reply.Status == IPStatus.Success)
    {
        try
        {
            IPHostEntry iPHost = Dns.GetHostEntry(e.Reply.Address);
            this.IPHosts.Add(iPHost);
        }
        catch
        {

        }
    }
}

开个后台线程去获取,这个获取局域网主机不是特别快

标签:string,C#,主机,mo,Contains,局域网,mServiceName
来源: https://www.cnblogs.com/zzr-stdio/p/11096493.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有