Используйте "arp -a", чтобы получить MA C адрес соответствующего IP-адреса. - PullRequest
1 голос
/ 15 февраля 2020

Я пытался преобразовать MA C адрес моего телефона в его 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

Что я не могу понять, так это как получить указанный c IP для данного MA C. Предположим, что мой телефон - это устройство с физическим адресом: a8-3e-0e-61-3f-db, как я могу где-то сохранить его IP в виде строки?

Ответы [ 4 ]

0 голосов
/ 16 февраля 2020
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;

Я использовал каждую запись в списке результатов как строку и искал свой MA C как подстроку во всех записях.

0 голосов
/ 15 февраля 2020

Вы можете использовать Dictionary структуру данных в C# для хранения 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

0 голосов
/ 15 февраля 2020

Вы можете создать класс модели, в котором будет храниться информация об 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
0 голосов
/ 15 февраля 2020

Я предполагаю, что у вас есть список строк как-то (метод ExecuteCommandLine) и вы хотите иметь возможность фильтровать его по значению arp. Regex может быть вариантом:

void Main()
{
    // just setting it up for testing
    List<string> result = new List<string>();
    result.Add("192.168.137.1         2e-bb-58-0a-2f-34     dynamic");
    result.Add("192.168.137.44        a8-3e-0e-61-3f-db     dynamic");
    result.Add("224.0.0.22            01-00-5e-00-00-16     static");
    result.Add("224.0.0.22            01-00-5e-00-00-16     static");
    result.Add("192.168.137.91        d4-63-c6-b2-ac-38     dynamic");
    result.Add("224.0.0.22            01-00-5e-00-00-16     static");
    result.Add("224.0.0.252           01-00-5e-00-00-fc     static");

    // this is the part you want
    ConcurrentDictionary<string,string> arps = new ConcurrentDictionary<string, string>();
    foreach (var s in result)
    {
        var matches = Regex.Match(s, @"((?:\d+\.?){4})\s+((?:[0-9a-f]{2}-?){6}).*");        
        arps.TryAdd(matches.Groups[2].Value, matches.Groups[1].Value);
    }

    Console.WriteLine(arps["01-00-5e-00-00-16"]);
}

note: выбор словаря здесь имеет свои преимущества и недостатки. вы получите O(1) времени доступа к элементу, но у вас не будет дублирующих адресов MA C. Не зная вашего конкретного варианта использования c, довольно сложно сказать, будет ли этот компромисс применим к вам, я просто указываю это как вариант.

...