如何从c#和.net枚举网络上的设备?



我正在写一个Windows桌面应用程序,通过无线网络(WLAN)与我的数码单反相机通信。我需要一种方法来扫描网络,并找到相机的MAC地址或其他识别信息。Nirsoft无线网络监视器显示有关我的网络上的每个设备的信息。(具体来说:"IP地址"、"设备名称"、"MAC地址"、"网络适配器公司"等). net是否提供了一种从c#中检索这些信息的方法?

您可以查看下面的博客,其中有人已经编写了类似的代码。https://www.maniuk.net/2016/08/get-ip-address-by-mac-address-in-csharp.html

使用命令行arp命令作为外部进程。我已经测试过了,似乎工作得很好。按照代码,mac地址的格式必须是aa-bb-cc-dd-ee-ff

或者,有一个Nuget包叫做arlookup。https://www.nuget.org/packages/ArpLookup/

使用这个,你必须提供IP地址,它将返回mac地址。因此,您必须枚举您的IP范围,并返回与mac地址匹配的IP。

像这样:

private static async Task<string> GetIPFromMAC(string macAddress)
{
    var ping = new Ping();
    var start = BitConverter.ToInt32(new byte[] { 1, 0, 168, 192 }, 0);
    var end = BitConverter.ToInt32(new byte[] { 254, 0, 168, 192 }, 0);
    for (var i = start; i <= end; i++)
    {
        var bytes = BitConverter.GetBytes(i);
        var ipAddress = new IPAddress(new[] {bytes[3], bytes[2], bytes[1], bytes[0]});
        var reply = ping.Send(ipAddress, 200);
        if (reply == null || reply.Status == IPStatus.TimedOut) continue;
        
        var mac = await Arp.LookupAsync(ipAddress);
        if (macAddress == mac.ToString()) return ipAddress.ToString();
    }
    return string.Empty;
}

您需要将start和end中的值替换为您的IP范围,然后您可以像这样调用代码。

var ip = GetIPFromMAC("aabbccddeeff").Result;

最新更新