
如何根據IP地址獲得ARP表中配接器的索引呢?
使用C#語言
如圖,我通過arp -a命令可以得到arp表
我希望可以通過192.168.1.122然后得到回傳值為0x6的的函式或者通過192.168.1.3得到0x7的回傳值。
uj5u.com熱心網友回復:
這個代碼可以實作介面IP192.168.1.3 => 查對應的介面序號、該介面下所有ARP記錄;
介面序號 0x7 => 查對應的介面IP、該介面下所有ARP記錄;
ARP記錄的IP地址 192.168.1.122 => ARP記錄的MAC地址,以及所有包含該IP的介面所對應的IP、序號;
ARP記錄的MAC地址 50-8c-f5-f6-31-34 => ARP記錄的IP地址,以及所有包含該IP的介面所對應的IP、序號。
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text.RegularExpressions;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
//呼叫 arp.exe -a,并通過重定向標準輸出獲取命令的結果
Process proc = Process.Start(
new ProcessStartInfo()
{
FileName = "arp.exe",
Arguments = "-a",
UseShellExecute = false,
RedirectStandardOutput = true
});
proc.Start();
string result = proc.StandardOutput.ReadToEnd();
proc.WaitForExit();
//---------------------決議命令的結果,按介面切割并單獨處理
var sections = result.Split('接');
//以介面IP和介面ID號為索引,查arp記錄(正查)
//結果包含arp記錄中的IP和MAC
//字典的Value資料型別是ValueTuple型別,C#7或者更高的版本可以支持
//如果你的版本不夠,可以把Value的型別改成自定義結構體或者類,下同
Dictionary<string, List<(string IfIP, string Index, string ArpIp, string MAC)>> dicIf =
new Dictionary<string, List<(string IfIP, string Index, string ArpIp, string MAC)>>();
//以arp記錄里的IP或MAC為索引(反查),查介面
//結果包含介面的IP和索引
Dictionary<string, List<(string IfIP, string Index, string ArpIp, string MAC)>> dicIP =
new Dictionary<string, List<(string IfIP, string Index, string ArpIp, string MAC)>>();
foreach (var section in sections)
{
if (!section.Contains("口")) continue;//split的第一個成員是個"\r\n",跳過
//取得介面的IP,以及介面ID號
var match =
Regex.Match(
section, @"口.*?(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).*?(0x[0-9a-f]+)");
string ifIP = match.Groups[1].Value;
string ifIndex = match.Groups[2].Value;
dicIf[ifIP] = new List<(string IfIP, string Index, string ArpIp, string MAC)>();
dicIf[ifIndex] = new List<(string IfIP, string Index, string ArpIp, string MAC)>();
//用正則匹配該介面下所有的arp記錄
//Group[1]是IP,Group[2]是MAC
var matches =
Regex.Matches(
section,
@"(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+([0-9a-f-]{17})\s+\S+\s+",
RegexOptions.Singleline | RegexOptions.IgnoreCase);
foreach (Match m in matches)
{
string ip = m.Groups[1].Value;
//IP首段大于223,該 IP為組播地址或廣播地址,不需要處理
string ipPrefix = ip.Split('.')[0];
if (Convert.ToInt32(ipPrefix) > 223) continue;
string mac = m.Groups[2].Value;
//添加正向查找記錄
dicIf[ifIP].Add((ifIP, ifIndex, ip, mac));
dicIf[ifIndex].Add((ifIP, ifIndex, ip, mac));
//添加反向查找記錄,arp條目中的ip和mac各添加一次
foreach (var key in new string[] { ip, mac })
{
if (dicIP.ContainsKey(key))
{
dicIP[key].Add((ifIP, ifIndex, ip, mac));
}
else
{
dicIP[key] =
new List<(string IfIP, string Index, string ArpIp, string MAC)>() { (ifIP, ifIndex, ip, mac) };
}
}
}
}
Console.WriteLine("正向查找字典(介面ip/序號 => arp記錄):");
foreach (var key in dicIf.Keys)
{
Console.WriteLine(
$"KEY:{key}\r\nVALUES:【" +
$"{string.Join("\r\n", dicIf[key].Select(r => $"介面IP: {r.IfIP}, 介面序號: {r.Index}, ARP-IP: {r.ArpIp}, ARP-MAC: {r.MAC}"))}】\r\n");
}
Console.WriteLine("反向查找字典:(arp記錄的ip/mac => 介面ip/序號)");
foreach (var key in dicIP.Keys)
{
Console.WriteLine(
$"KEY:{key}\r\nVALUES:【" +
$"{string.Join("\r\n", dicIP[key].Select(r => $"介面IP: {r.IfIP}, 介面序號: {r.Index}, ARP-IP: {r.ArpIp}, ARP-MAC: {r.MAC}"))}】\r\n");
}
Console.Read();
}
}
}
運行結果
正向查找字典(介面ip/序號 => arp記錄):
KEY:192.168.220.1
VALUES:【介面IP: 192.168.220.1, 介面序號: 0x7, ARP-IP: 192.168.220.254, ARP-MAC: 00-50-56-e6-ca-af
介面IP: 192.168.220.1, 介面序號: 0x7, ARP-IP: 192.168.220.255, ARP-MAC: ff-ff-ff-ff-ff-ff】
KEY:0x7
VALUES:【介面IP: 192.168.220.1, 介面序號: 0x7, ARP-IP: 192.168.220.254, ARP-MAC: 00-50-56-e6-ca-af
介面IP: 192.168.220.1, 介面序號: 0x7, ARP-IP: 192.168.220.255, ARP-MAC: ff-ff-ff-ff-ff-ff】
KEY:192.168.2.51
VALUES:【介面IP: 192.168.2.51, 介面序號: 0xb, ARP-IP: 192.168.2.1, ARP-MAC: 00-15-5d-02-32-03
介面IP: 192.168.2.51, 介面序號: 0xb, ARP-IP: 192.168.2.50, ARP-MAC: 00-10-18-3a-58-8b
介面IP: 192.168.2.51, 介面序號: 0xb, ARP-IP: 192.168.2.52, ARP-MAC: 00-50-56-3a-ee-69
介面IP: 192.168.2.51, 介面序號: 0xb, ARP-IP: 192.168.2.68, ARP-MAC: 4c-0b-be-04-22-3e
介面IP: 192.168.2.51, 介面序號: 0xb, ARP-IP: 192.168.2.255, ARP-MAC: ff-ff-ff-ff-ff-ff】
KEY:0xb
VALUES:【介面IP: 192.168.2.51, 介面序號: 0xb, ARP-IP: 192.168.2.1, ARP-MAC: 00-15-5d-02-32-03
介面IP: 192.168.2.51, 介面序號: 0xb, ARP-IP: 192.168.2.50, ARP-MAC: 00-10-18-3a-58-8b
介面IP: 192.168.2.51, 介面序號: 0xb, ARP-IP: 192.168.2.52, ARP-MAC: 00-50-56-3a-ee-69
介面IP: 192.168.2.51, 介面序號: 0xb, ARP-IP: 192.168.2.68, ARP-MAC: 4c-0b-be-04-22-3e
介面IP: 192.168.2.51, 介面序號: 0xb, ARP-IP: 192.168.2.255, ARP-MAC: ff-ff-ff-ff-ff-ff】
KEY:192.168.219.1
VALUES:【介面IP: 192.168.219.1, 介面序號: 0x10, ARP-IP: 192.168.219.254, ARP-MAC: 00-50-56-fb-f5-b1
介面IP: 192.168.219.1, 介面序號: 0x10, ARP-IP: 192.168.219.255, ARP-MAC: ff-ff-ff-ff-ff-ff】
KEY:0x10
VALUES:【介面IP: 192.168.219.1, 介面序號: 0x10, ARP-IP: 192.168.219.254, ARP-MAC: 00-50-56-fb-f5-b1
介面IP: 192.168.219.1, 介面序號: 0x10, ARP-IP: 192.168.219.255, ARP-MAC: ff-ff-ff-ff-ff-ff】
反向查找字典:(arp記錄的ip/mac => 介面ip/序號)
KEY:192.168.220.254
VALUES:【介面IP: 192.168.220.1, 介面序號: 0x7, ARP-IP: 192.168.220.254, ARP-MAC: 00-50-56-e6-ca-af】
KEY:00-50-56-e6-ca-af
VALUES:【介面IP: 192.168.220.1, 介面序號: 0x7, ARP-IP: 192.168.220.254, ARP-MAC: 00-50-56-e6-ca-af】
KEY:192.168.220.255
VALUES:【介面IP: 192.168.220.1, 介面序號: 0x7, ARP-IP: 192.168.220.255, ARP-MAC: ff-ff-ff-ff-ff-ff】
KEY:ff-ff-ff-ff-ff-ff
VALUES:【介面IP: 192.168.220.1, 介面序號: 0x7, ARP-IP: 192.168.220.255, ARP-MAC: ff-ff-ff-ff-ff-ff
介面IP: 192.168.2.51, 介面序號: 0xb, ARP-IP: 192.168.2.255, ARP-MAC: ff-ff-ff-ff-ff-ff
介面IP: 192.168.219.1, 介面序號: 0x10, ARP-IP: 192.168.219.255, ARP-MAC: ff-ff-ff-ff-ff-ff】
KEY:192.168.2.1
VALUES:【介面IP: 192.168.2.51, 介面序號: 0xb, ARP-IP: 192.168.2.1, ARP-MAC: 00-15-5d-02-32-03】
KEY:00-15-5d-02-32-03
VALUES:【介面IP: 192.168.2.51, 介面序號: 0xb, ARP-IP: 192.168.2.1, ARP-MAC: 00-15-5d-02-32-03】
KEY:192.168.2.50
VALUES:【介面IP: 192.168.2.51, 介面序號: 0xb, ARP-IP: 192.168.2.50, ARP-MAC: 00-10-18-3a-58-8b】
KEY:00-10-18-3a-58-8b
VALUES:【介面IP: 192.168.2.51, 介面序號: 0xb, ARP-IP: 192.168.2.50, ARP-MAC: 00-10-18-3a-58-8b】
KEY:192.168.2.52
VALUES:【介面IP: 192.168.2.51, 介面序號: 0xb, ARP-IP: 192.168.2.52, ARP-MAC: 00-50-56-3a-ee-69】
KEY:00-50-56-3a-ee-69
VALUES:【介面IP: 192.168.2.51, 介面序號: 0xb, ARP-IP: 192.168.2.52, ARP-MAC: 00-50-56-3a-ee-69】
KEY:192.168.2.68
VALUES:【介面IP: 192.168.2.51, 介面序號: 0xb, ARP-IP: 192.168.2.68, ARP-MAC: 4c-0b-be-04-22-3e】
KEY:4c-0b-be-04-22-3e
VALUES:【介面IP: 192.168.2.51, 介面序號: 0xb, ARP-IP: 192.168.2.68, ARP-MAC: 4c-0b-be-04-22-3e】
KEY:192.168.2.255
VALUES:【介面IP: 192.168.2.51, 介面序號: 0xb, ARP-IP: 192.168.2.255, ARP-MAC: ff-ff-ff-ff-ff-ff】
KEY:192.168.219.254
VALUES:【介面IP: 192.168.219.1, 介面序號: 0x10, ARP-IP: 192.168.219.254, ARP-MAC: 00-50-56-fb-f5-b1】
KEY:00-50-56-fb-f5-b1
VALUES:【介面IP: 192.168.219.1, 介面序號: 0x10, ARP-IP: 192.168.219.254, ARP-MAC: 00-50-56-fb-f5-b1】
KEY:192.168.219.255
VALUES:【介面IP: 192.168.219.1, 介面序號: 0x10, ARP-IP: 192.168.219.255, ARP-MAC: ff-ff-ff-ff-ff-ff】
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/12051.html
標籤:網絡通信
下一篇:和服務器有關的設備概念、作用
