2012-01-19 291 views
1

我試圖將IP地址轉換爲MAC地址,然後將其轉換爲字節數組。我卡在第一部分,不知道如何做到這一點。我看到一些搜索結果在討論System.Net.NetworkInformation.NetworkInterface,但不知道如何使用它。如何將IP地址轉換爲MAC地址字節數組?

這是我需要MAC字節數組的代碼。這個怎麼做?

[DllImport("iphlpapi.dll", ExactSpelling = true)] 
public static extern int SendARP(int DestIP, int SrcIP, byte[] pMacAddr, ref uint PhyAddrLen); 

private void Ping(IPAddress address) 
{ 
    byte[] macAddr = new byte[6]; 
    uint macAddrLen = uint.Parse(macAddr.Length.ToString()); 

    if (SendARP(int.Parse(address.ToString()), 0, macAddr, ref macAddrLen) == 0) 
    { 
     //SUCCESS! 
    } 
} 
+1

你想做什麼? MAC地址是不可訪問的,除了在主機上,所以我不明白你的問題 – CharlesB

+0

@CharlesB,我試圖使[這個](http://stackoverflow.com/a/8924588/720323)工作。問題是我的最後一個變量macAddrLen未分配。 – HelpNeeder

+2

適配器的MAC地址只能在同一網段上使用。不在路由器的另一端。 – spender

回答

6

獲取關於你盡力去做。它將你的電話號碼翻譯成街道的名稱 - 它們之間沒有任何關聯。

MAC地址在以太網級驅動程序中編碼,而IP地址是IP協議更高級的仿真結構。這是關係。路由器通過協議(ARP - 地址解析協議)發現MAC地址發送IP數據包,並且這不能跨網段。

+0

非常明確的解釋。好的,所以我一直在錯誤地看待它。 +1。 – HelpNeeder

4

看一看here

byte[] macAddr = new byte[6]; 
uint macAddrLen = (uint) macAddr.Length; 
if (SendARP((int)address.Address, 0, macAddr, ref macAddrLen) != 0) 
    throw new InvalidOperationException("SendARP failed."); 

string[] str = new string[(int)macAddrLen]; 
for (int i = 0; i < macAddrLen; i++) 
    str[i] = macAddr[i].ToString("x2"); 

Console.WriteLine(string.Join(":", str)); 
+0

我正在嘗試這段代碼,但與我的相同,它會導致if語句行出錯:輸入字符串的格式不正確。你知道這是爲什麼嗎? – HelpNeeder

+0

@HelpNeeder請參閱我的編輯。錯誤是在調用int.Parse(將地址轉換爲字符串將返回一個IP形式爲「xxxx」,無法轉換爲int) – Strillo

+0

該代碼不起作用,因爲您試圖將IP字符串,然後解析成int - > int.Parse(address.ToString())。要使代碼正常工作,需要一個IP地址對象,然後像這樣使用它:(int)YourIPObject.Address – SanBen

3

其實MAC地址提供給您。您不需要知道計算機具有的MAC地址。調用SendARP函數後,macAddr將保存MAC地址。

MSDN documentation中,您可以看到參數macAddr和macAddrLen被標記爲[out],這意味着函數使用此參數爲您返回一個值。

Address Resolution Protocol整點是,你可以解決網絡層地址(IP)到物理不會忽略(MAC)