پیدا کردن MAC Address از روی IP


دستگاه کارتخوان تحت شبکه*ای را تصور کنید که تا دیروز در شبکه دیده می*شد اما امروز ناپدید شده! دیگر نمی*شود با آن ارتباط برقرار کرد و توسط برنامه نوشته شده آن*را تخلیه کرد. به صورت پیش فرض یک IP ثابت به این دستگاه*ها انتساب داده می*شود مثلا 192.168.1.100 . حال اگر در شبکه این IP رزرو نشود ممکن است DHCP این IP را به کامپیوتر دیگری بدهد یا روتری به اشتباه از آن استفاده کند. الان چطور باید تشخیص داد که این IP توسط چه وسیله*ای در حال استفاده است؟
برای بدست آوردن MAC Address یک دیوایس در شبکه از دستور خط فرمان ARP می*توان استفاده کرد. برای مثال:

arp -a

و یا :
arp -a findstr 192.168.1.100

اگر در این لیست*ها MAC Address آی پی مورد نظر شما یافت نشد، ابتدا آن IP را ping کنید و بعد دستورات فوق را استفاده نمائید. علت هم این است که دستورات فوق تنها ARP table ایی را بر اساس ارتباطات ایستگاه کاری فعلی با شبکه نمایش می*دهند و اگر کامپیوتر فعلی هیچ ارتباطی با IP مورد نظر نداشته باشد، خروجی خاصی را نمایش نخواهد داد.

حال اگر با برنامه نویسی بخواهیم این*کار را انجام دهیم با استفاده از تابع API زیر نیز می*توان به همین نتیجه رسید:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[System.Runtime.InteropServices.DllImport("Iphlpapi.dll", EntryPoint = "SendARP")]
internal extern static Int32 SendArp(Int32 destIpAddress, Int32 srcIpAddress, byte[] macAddress, ref Int32 macAddressLength);

public static System.Net.NetworkInformation.PhysicalAddress GetMacFromIP(System.Net.IPAddress IP)
{
if (IP.AddressFamily != System.Net.Sockets.AddressFamily.InterNetwork)
throw new ArgumentException("supports just IPv4 addresses");

Int32 addrInt = IpToInt(IP);
Int32 srcAddrInt = 0;
byte[] mac = new byte[6]; // 48 bit

int length = mac.Length;
int reply = SendArp(addrInt, srcAddrInt, mac, ref length);

byte[] emptyMac = new byte[12];

if (reply != 0)
{
//No MAC Address found for the IP Address
return new System.Net.NetworkInformation.PhysicalAddress(empt yMac);
}
return new System.Net.NetworkInformation.PhysicalAddress(mac) ;
}

private static Int32 IpToInt(System.Net.IPAddress IP)
{
byte[] bytes = IP.GetAddressBytes();
return BitConverter.ToInt32(bytes, 0);
}

برای پاک کردن خروجی های اضافی و داشتن تنها "مک آدرس" از دستور زیر استفاده کنید:
کد:

arp -a ip-address | awk '{print $4}'





موضوعات مشابه: