【问题标题】:Is It possible to Get list of IP address connected in LAN,in C# without using win32 API library.?是否可以在不使用 win32 API 库的情况下在 C# 中获取 LAN 中连接的 IP 地址列表?
【发布时间】:2011-08-24 03:32:57
【问题描述】:

我正在尝试获取连接在 LAN 中的 IP 地址列表, 是否可以不使用win32 API库。(Netapi32.dll)。 不使用非托管 win32 动态库的任何想法。目标为 Windows 7 操作系统

【问题讨论】:

  • 看起来您正在使用@Darryl Braaten 的答案。如果是这样,您应该将该答案标记为已接受的答案。如果您想讨论如何加快您发布的代码,您应该将其作为一个新问题发布。 StackOverflow 的模型是一问一答。

标签: c# winapi networking windows-7


【解决方案1】:

您可以使用NetworkInterface 对象来获取所有机器的网络接口。

var networkCards = System.Net.NetworkInterface.GetAllNetworkInterfaces();
foreach(var card in networkCards)
    Console.WriteLine(card.GetPhysicalAddress());

【讨论】:

  • 我没有问我的实际地址。
  • 要清楚我想收集所有连接在局域网中的IP地址,而不是物理地址。比如192.168.1.1 192.168.1.15
【解决方案2】:

如果您收到响应,则可以使用System.Net.NetworkInformation.Ping ping 子网中的每个 IP,即有一台机器正在使用该 IP。如果您没有得到 ip 可用的响应,或者机器忽略 ping。

更新为添加代码以并行执行此操作。

public string IPList()
        {
            string myipsplit = string.Empty;
            string localhostname = Dns.GetHostName();
            IPAddress[] paddresses = Dns.GetHostAddresses(localhostname);
            string myip = paddresses.Where( ip => ip.AddressFamily == AddressFamily.InterNetwork).FirstOrDefault().ToString();
            string[] myiparray = myip.Split(new[] { '.' });
            for (int j = 1; j < myiparray.Length; j++)
                myipsplit += myiparray[j - 1] + ".";
            Trace.WriteLine(DateTime.Now);
            var results = new string[0x100];
            System.Threading.Tasks.Parallel.For(1, 0x100, id =>
                           {
                              var pingSender = new Ping();
                              string ls = myipsplit + id;
                              PingReply reply = pingSender.Send(ls, 100);
                              if (reply != null)
                                    if (reply.Status == IPStatus.Success)
                                        results[id] = reply.Address.ToString();
                            });

            Trace.WriteLine(DateTime.Now);
            var sb = new StringBuilder();
            results.All(x => { sb.AppendFormat("{0} ", x);
                                 return true;
            });
            return sb.ToString();
        }

更新为 .Net 2.0

private delegate void MyPing(int id);
        public string IPList2()
        {

            string myipsplit = string.Empty;
            string localhostname = Dns.GetHostName();
            IPAddress[] paddresses = Dns.GetHostAddresses(localhostname);
            string myip = paddresses.Where(ip => ip.AddressFamily == AddressFamily.InterNetwork).FirstOrDefault().ToString();
            string[] myiparray = myip.Split(new[] { '.' });
            for (int j = 1; j < myiparray.Length; j++)
                myipsplit += myiparray[j - 1] + ".";
            Trace.WriteLine(DateTime.Now);
            var results = new string[0x100];
            MyPing ping = 
             id =>
            {
                string ls = myipsplit + id;
                var pingSender = new Ping();
                PingReply reply = pingSender.Send(ls, 100);
                if (reply != null)
                    if (reply.Status == IPStatus.Success)
                        results[id] = reply.Address.ToString();
            };
            var asyncResults = new IAsyncResult[0x100];
            for (int i = 1; i < 0x100; i++)
            {
                asyncResults[i] = ping.BeginInvoke(i, null, null);
            }
            for (int i = 1; i < 0x100; i++)
            {
                ping.EndInvoke(asyncResults[i]);
            }
            Trace.WriteLine(DateTime.Now);
            var sb = new StringBuilder();
            for (int i = 1; i < 0x100; i++)
            {
                if (results[i]!=null)
                    sb.AppendFormat("{0} ", results[i]);
            }
            return sb.ToString();
        }

【讨论】:

  • 显然你是正确的,但是方法是针对 C#.Net 2.0 的。
  • 已更新为手动执行并行操作。如果您不能使用 lamba,您可以更新为使用旧式委托。
  • @arun 我是在 Windows 7 上写的。什么不适合你?你有任何错误吗?您是以受限用户还是管理员身份运行?
  • 达里尔,问题是由于虚拟网络接口和 IPAddress[] paddresses = Dns.GetHostAddresses(localhostname); string myip = paddresses.Where(ip => ip.AddressFamily == AddressFamily.InterNetwork).FirstOrDefault().ToString();以下代码无法获得准确的物理网络接口适配器。任何人都感谢我在一些限制下节省了代码
【解决方案3】:
public string IPList()
        {
            var pingSender = new Ping();
            string port = string.Empty;
            string myipsplit = string.Empty;
            string localhostname = Dns.GetHostName();
            IPAddress[] paddresses = Dns.GetHostAddresses(localhostname);
            string myip = paddresses[0].ToString();
            string[] myiparray = myip.Split(new[] {'.'});
            for (int j = 1; j < myiparray.Length; j++)
                myipsplit += myiparray[j - 1] + ".";
            Trace.WriteLine(DateTime.Now);
            for (int i = 0; i < 0x100; i++)
            {
                string ls = myipsplit + i;
                PingReply reply = pingSender.Send(ls, 0);
                if (reply != null)
                    if (reply.Status == IPStatus.Success)
                        port += reply.Address + "+";
            }
            Trace.WriteLine(DateTime.Now);
            return port;
        }

【讨论】:

  • 使用 System.Threading.Tasks.Parallel.For 并行执行一堆 ping。
  • 我在答案中添加了一些有效的并行代码,它还修复了您发布的代码中的一些错误。
猜你喜欢
  • 1970-01-01
  • 2015-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-06
  • 2018-02-17
  • 1970-01-01
  • 2014-01-23
相关资源
最近更新 更多