دستگاه کارتخوان تحت شبکهای را تصور کنید که تا دیروز در شبکه دیده میشد اما امروز ناپدید شده! دیگر نمیشود با آن ارتباط برقرار کرد و توسط برنامه نوشته شده آنرا تخلیه کرد. به صورت پیش فرض یک 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 زیر نیز میتوان به همین نتیجه رسید:
[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(emptyMac);
}
return new System.Net.NetworkInformation.PhysicalAddress(mac);
}
private static Int32 IpToInt(System.Net.IPAddress IP)
{
byte[] bytes = IP.GetAddressBytes();
return BitConverter.ToInt32(bytes, 0);
}
مک آدرسی که در حال استفاده از IP ما بود:
00:0F:8F:F1:EE:40
مک آدرس واقعی دستگاه کارتخوان:
00.64.00.00.5E.7A
این تداخل رخ داده، باعث شده بود که ارتباط با دستگاه کارتخوان قطع شود. همانطور که میدانید سه بایت اول هر مک آدرس میتواند بیانگر
شرکت سازندهای باشد. 00:0F:8F مربوط به روترهای سیسکو است.