public string GetMacAddress(string ipAddress)
{
string macAddress = string.Empty;
System.Diagnostics.Process pProcess = new System.Diagnostics.Process();
pProcess.StartInfo.FileName = "arp";
pProcess.StartInfo.Arguments = "-a " + ipAddress;
pProcess.StartInfo.UseShellExecute = false;
pProcess.StartInfo.RedirectStandardOutput = true;
pProcess.StartInfo.CreateNoWindow = true;
pProcess.Start();
string strOutput = pProcess.StandardOutput.ReadToEnd();
string[] substrings = strOutput.Split('-');
if (substrings.Length >= 8)
{
macAddress = substrings[3].Substring(Math.Max(0, substrings[3].Length - 2))
+ "-" + substrings[4] + "-" + substrings[5] + "-" + substrings[6]
+ "-" + substrings[7] + "-"
+ substrings[8].Substring(0, 2);
return macAddress;
}
else
{
return "not found";
}
}
बहुत देर से संपादित करें: खुला souce परियोजना में iSpy (https://github.com/ispysoftware/iSpy) वे इस कोड है, जो और भी अधिक एक छोटे से अच्छे है
public static void RefreshARP()
{
_arpList = new Dictionary<string, string>();
_arpList.Clear();
try
{
var arpStream = ExecuteCommandLine("arp", "-a");
// Consume first three lines
for (int i = 0; i < 3; i++)
{
arpStream.ReadLine();
}
// Read entries
while (!arpStream.EndOfStream)
{
var line = arpStream.ReadLine();
if (line != null)
{
line = line.Trim();
while (line.Contains(" "))
{
line = line.Replace(" ", " ");
}
var parts = line.Trim().Split(' ');
if (parts.Length == 3)
{
string ip = parts[0];
string mac = parts[1];
if (!_arpList.ContainsKey(ip))
_arpList.Add(ip, mac);
}
}
}
}
catch (Exception ex)
{
Logger.LogExceptionToFile(ex, "ARP Table");
}
if (_arpList.Count > 0)
{
foreach (var nd in List)
{
string mac;
ARPList.TryGetValue(nd.IPAddress.ToString(), out mac);
nd.MAC = mac;
}
}
}
https://github.com/ispysoftware/iSpy/blob/master/Server/NetworkDeviceList.cs
अद्यतन 2 का उपयोग देर से, लेकिन मुझे लगता है कि यह सबसे अच्छा है क्योंकि यह रेगेक्स का उपयोग करता है जो सटीक मैचों के लिए बेहतर जांचता है।
public string getMacByIp(string ip)
{
var macIpPairs = GetAllMacAddressesAndIppairs();
int index = macIpPairs.FindIndex(x => x.IpAddress == ip);
if (index >= 0)
{
return macIpPairs[index].MacAddress.ToUpper();
}
else
{
return null;
}
}
public List<MacIpPair> GetAllMacAddressesAndIppairs()
{
List<MacIpPair> mip = new List<MacIpPair>();
System.Diagnostics.Process pProcess = new System.Diagnostics.Process();
pProcess.StartInfo.FileName = "arp";
pProcess.StartInfo.Arguments = "-a ";
pProcess.StartInfo.UseShellExecute = false;
pProcess.StartInfo.RedirectStandardOutput = true;
pProcess.StartInfo.CreateNoWindow = true;
pProcess.Start();
string cmdOutput = pProcess.StandardOutput.ReadToEnd();
string pattern = @"(?<ip>([0-9]{1,3}\.?){4})\s*(?<mac>([a-f0-9]{2}-?){6})";
foreach (Match m in Regex.Matches(cmdOutput, pattern, RegexOptions.IgnoreCase))
{
mip.Add(new MacIpPair()
{
MacAddress = m.Groups["mac"].Value,
IpAddress = m.Groups["ip"].Value
});
}
return mip;
}
public struct MacIpPair
{
public string MacAddress;
public string IpAddress;
}
स्रोत
2013-10-08 09:40:34
यह काम करता है नहीं जानते कि क्या है, लेकिन एक त्वरित गूगल खोज के साथ मैं इस पुस्तकालय जो चाल करना चाहिए मिली: [http: // www। tamirgal.com/blog/post/ARP-Resolver-C-Class.aspx ](http://www.tamirgal.com/blog/post/ARP-Resolver-C-Class.aspx) –
धन्यवाद, मुझे विश्वास है कि मैं एआरपी टेबल को असंगत होने के लिए पढ़ा है और यह सोच रहा था कि मैक पते के लिए 'पिंग' का कोई तरीका है या नहीं। –
मैं ** ** सोचता हूं कि यदि आप एक नियमित पिंग (या अन्यथा संपर्क करने का प्रयास करते हैं) आईपी एड्रेस करते हैं तो यह एआरपी टेबल रीफ्रेश करने का कारण बनता है (अन्यथा नेटवर्क स्टैक मशीन को पहले स्थान से संपर्क करने में सक्षम नहीं होगा); निश्चित रूप से यह वांछित मशीन ऑनलाइन होने पर ही (अगर बिलकुल) काम करेगा। मुझे नहीं लगता कि आप ऑफ़लाइन आईपी पते के लिए विश्वसनीय परिणाम प्राप्त कर सकते हैं, विशेष रूप से यदि आपके पास गतिशील रूप से असाइन किए गए आईपी हैं। हालांकि मैं नेटवर्क विशेषज्ञ नहीं हूं, इसलिए मैं गलत हो सकता हूं (समस्या पर आपके साथ सोचने की कोशिश कर रहा हूं)। –