C# 使用「;arp-a";检索相应IP地址的MAC地址

C# 使用「;arp-a";检索相应IP地址的MAC地址,c#,string,list,ip-address,mac-address,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); } 我不明白的是,如何为给

我试着把我手机的MAC地址转换成它的IP地址

var arpStream = ExecuteCommandLine("arp", "-a");
List<string> result = new List<string>();
   while (!arpStream.EndOfStream)
  {
      var line = arpStream.ReadLine().Trim();
      result.Add(line);
  }
我不明白的是,如何为给定的MAC检索特定的IP。
假设我的手机是物理地址为a8-3e-0e-61-3f-db的设备,我如何将其IP存储为字符串?

我假设您以某种方式获得了字符串列表(
ExecuteCommandLine
方法),并希望能够根据arp值对其进行过滤。正则表达式可以是一个选项,然后:

void Main()
{
//只是为了测试而设置
列表结果=新列表();
结果。添加(“192.168.137.1 2e-bb-58-0a-2f-34动态”);
结果。添加(“192.168.137.44 a8-3e-0e-61-3f-db动态”);
结果。添加(“224.0.0.22 01-00-5e-00-00-16静态”);
结果。添加(“224.0.0.22 01-00-5e-00-00-16静态”);
结果。添加(“192.168.137.91 d4-63-c6-b2-ac-38动态”);
结果。添加(“224.0.0.22 01-00-5e-00-00-16静态”);
结果。添加(“224.0.0.252 01-00-5e-00-00-fc静态”);
//这就是你想要的部分
ConcurrentDictionary arps=新建ConcurrentDictionary();
foreach(结果中的var s)
{
var matches=Regex.Match(s,@“((?:\d+\。?){4})\s+((?:[0-9a-f]{2}-?){6})。*”;
arps.TryAdd(matches.Groups[2]。值,matches.Groups[1]。值);
}
控制台写入线(arps[“01-00-5e-00-00-16”];
}
注意:在这里选择字典既有好处也有缺点。
您将获得元素访问时间,但不能有重复的MAC地址。在不了解您的具体用例的情况下,很难说这种折衷是否适用于您,我只是将其作为一种选择指出。

我假设您以某种方式获得了字符串列表(
ExecuteCommandLine
方法),并希望能够基于arp值对其进行过滤。正则表达式可以是一个选项,然后:

void Main()
{
//只是为了测试而设置
列表结果=新列表();
结果。添加(“192.168.137.1 2e-bb-58-0a-2f-34动态”);
结果。添加(“192.168.137.44 a8-3e-0e-61-3f-db动态”);
结果。添加(“224.0.0.22 01-00-5e-00-00-16静态”);
结果。添加(“224.0.0.22 01-00-5e-00-00-16静态”);
结果。添加(“192.168.137.91 d4-63-c6-b2-ac-38动态”);
结果。添加(“224.0.0.22 01-00-5e-00-00-16静态”);
结果。添加(“224.0.0.252 01-00-5e-00-00-fc静态”);
//这就是你想要的部分
ConcurrentDictionary arps=新建ConcurrentDictionary();
foreach(结果中的var s)
{
var matches=Regex.Match(s,@“((?:\d+\。?){4})\s+((?:[0-9a-f]{2}-?){6})。*”;
arps.TryAdd(matches.Groups[2]。值,matches.Groups[1]。值);
}
控制台写入线(arps[“01-00-5e-00-00-16”];
}
注意:在这里选择字典既有好处也有缺点。
您将获得元素访问时间,但不能有重复的MAC地址。在不了解您的具体用例的情况下,很难说这种折衷是否适用于您,我只是指出这是一种选择。

您可以使用C语言中的
字典
数据结构来保存
键值
对信息,在您的情况下,它是
Ipaddress Macaddress
信息

用法

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);
      }



}

代码

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);
      }



}

字符串输出=”;
var proc=newprocessstartinfo(“cmd.exe”,“c arp-a”)
{
CreateNoWindow=true,
UseShellExecute=false,
重定向标准输出=真,
RedirectStandardError=true,
WorkingDirectory=@“C:\Windows\System32\”
};
进程p=进程启动(proc);
p、 OutputDataReceived+=(发送方,args1)=>{output+=args1.Data+Environment.NewLine;};
p、 BeginOutputReadLine();
p、 WaitForExit();
var dict=新字典();
var lines=output.Split(新字符串[]{“\r\n”},StringSplitOptions.RemoveEmptyEntries);
foreach(行中的var行)
{
if(line.Contains(“静态”)| | line.Contains(“动态”))
{
var elements=line.Split(新字符串[]{“},StringSplitOptions.RemoveEmptyEntries);
var ipAdd=elements[0]。Trim();
var macAdd=elements[1]。Trim();
dict.Add(ipAdd、macAdd);
}
}
输出


您可以使用C语言中的
字典
数据结构来保存
键值
对信息。在您的情况下,它是
Ipaddress Macaddress
信息

用法

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);
      }



}

代码

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);
      }



}

字符串输出=”;
var proc=newprocessstartinfo(“cmd.exe”,“c arp-a”)
{
CreateNoWindow=true,
UseShellExecute=false,
重定向标准输出=真,
RedirectStandardError=true,
WorkingDirectory=@“C:\Windows\System32\”
};
进程p=进程启动(proc);
p、 OutputDataReceived+=(发送方,args1)=>{output+=args1.Data+Environment.NewLine;};
p、 BeginOutputReadLine();
p、 WaitForExit();
var dict=新字典();
var lines=output.Split(新字符串[]{“\r\n”},StringSplitOptions.RemoveEmptyEntries);
foreach(行中的var行)
{
if(line.Contains(“静态”)| | line.Contains(“动态”))
{
var elements=line.Split(新字符串[]{“},StringSplitOptions.RemoveEmptyEntries);
var ipAdd=elements[0]。Trim();
var macAdd=elements[1]。Trim();
dict.Add(ipAdd、macAdd);
}
}
输出


您可以创建一个模型类来存储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() });
}

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

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

    public string MAC { get; set; }

    public string IPType { get; set; }
}
现在,我们可以使用这个模型来解析所提供的列表,这将使我们能够更容易地解析所提供的列表