使用“ arp -a”检索相应IP地址的MAC地址

时间:2020-02-15 15:57:09

标签: c# string list ip-address mac-address

我试图将手机的MAC地址转换为IP地址。

var arpStream = ExecuteCommandLine("arp", "-a");
List<string> result = new List<string>();
   while (!arpStream.EndOfStream)
  {
      var line = arpStream.ReadLine().Trim();
      result.Add(line);
  }

使用上面的代码,我将其存储在以下形式的列表中:

  192.168.137.1         2e-bb-58-0a-2f-34     dynamic
  192.168.137.44        a8-3e-0e-61-3f-db     dynamic
  192.168.137.91        d4-63-c6-b2-ac-38     dynamic
  224.0.0.22            01-00-5e-00-00-16     static
  224.0.0.252           01-00-5e-00-00-fc     static

我不知道的是,如何为给定的MAC检索特定的IP。 假设我的电话是具有以下物理地址的设备:a8-3e-0e-61-3f-db,如何将其IP作为字符串存储在某个地方?

4 个答案:

答案 0 :(得分:0)

我假设您已经以某种方式获得了字符串列表(override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) navigationItem.titleView = titleView } 方法),并且希望能够基于arp值对其进行过滤。然后可以使用正则表达式:

ExecuteCommandLine

注意:在此处选择字典既有好处也有缺点。 您将获得O(1)个元素访问时间,但是那里不能有重复的MAC地址。在不知道您的特定用例的情况下,很难说出这种折衷是否适用于您,我只是指出了这一点。

答案 1 :(得分:0)

您可以在C#中使用 Dictionary 数据结构来保存key-value对信息(如果是Ipaddress-Macaddress信息)

enter image description here

用法

var macofIpaddress = dict["192.168.137.1"];

代码

string output = "";
var proc = new ProcessStartInfo("cmd.exe", "/c arp -a")
{
      CreateNoWindow = true,
      UseShellExecute = false,
      RedirectStandardOutput = true,
      RedirectStandardError = true,
      WorkingDirectory = @"C:\Windows\System32\"
};
Process p = Process.Start(proc);
p.OutputDataReceived += (sender, args1) => { output += args1.Data + Environment.NewLine; };
p.BeginOutputReadLine();
p.WaitForExit();


var dict = new Dictionary<string, string>();
var lines = output.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);

foreach(var line in lines)
{
      if (line.Contains("static") || line.Contains("dynamic"))
      {
         var elements = line.Split(new string[] { "    " }, StringSplitOptions.RemoveEmptyEntries);
        var ipAdd =   elements[0].Trim();
        var macAdd = elements[1].Trim();
        dict.Add(ipAdd,macAdd);
      }



}

输出

enter image description here

答案 2 :(得分:0)

您可以创建一个模型类,该模型类将存储IP信息,例如:

public class DeviceIPAddress
{
    public string IPv4 { get; set; }

    public string MAC { get; set; }

    public string IPType { get; set; }
}

现在,我们可以使用此模型来解析提供的列表,这将使我们更易于处理:

var ips = new List<DeviceIPAddress>();

foreach (var ip in result)
{
    var info = ip.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
    ips.Add(new DeviceIPAddress { IPv4 = info[0].Trim(), MAC = info[1].Trim(), IPType = info[2].Trim() });
}

现在使用ips列表,我们可以轻松管理收到的数据:

var getIP = ips.First(x => x.MAC.Equals("a8-3e-0e-61-3f-db", StringComparison.InvariantCultureIgnoreCase));
// call getIP.IPv4 will to get the IP 192.168.137.44

答案 3 :(得分:0)

String s = "";
for (int i = 3; i < result.Count(); i++)
{
                s = Convert.ToString(result[i]);
                if (s.Contains(macAddress))
                {
                    break;
                }
}
char[] ip = new char[15];
StringBuilder ipaddr = new StringBuilder();
for (int i = 0; s[i].CompareTo(' ') != 0; i++)
{
                ipaddr.Append(s[i]);
}
return ipaddr;

我使用结果列表中的每个条目作为字符串,并在所有条目中寻找我的MAC作为子字符串。