2013-03-07 56 views
1

即時通訊嘗試檢索設備的MAC地址在我的局域網和即時通訊使用SendARP功能做到這一點,但由於一些奇怪的原因,它給了我錯誤的MAC地址,即時消息告訴它得到我的筆記本電腦的MAC也是局域網上,但它不工作:/C++ SendARP返回錯誤的MAC地址?

鏈接SendARP功能(MSDN):http://msdn.microsoft.com/en-us/library/windows/desktop/aa366358%28v=vs.85%29.aspx

筆記本電腦的MAC是真的:E0:94:67:18:A7:DC Mac由SendARP輸出:e9:ad:2d:01:c8:11

這是我創建的功能,只需從ip地址獲取mac:P

BYTE* GetMacAddress(IPAddr destination, IPAddr source) { 
Sleep(500); 
ULONG DestMacAddr[2]; 
ULONG PhysicalLength = 6; 

memset(&DestMacAddr, 0xff, sizeof(DestMacAddr)); 

DWORD returnValue = SendARP(destination, source, &DestMacAddr, &PhysicalLength); 

if(returnValue == NO_ERROR) { 
    cout << "Fetched destination mac" << endl; 
}else { 
    printf("Error: %d\n", returnValue); 

    if(returnValue == ERROR_BAD_NET_NAME) { 
     printf("ERROR_BAD_NET_NAME\n trying to fetch mac address..."); 
     return GetMacAddress(destination, source); 
    } 

    if(returnValue == ERROR_BUFFER_OVERFLOW) { 
     printf("ERROR_BUFFER_OVERFLOW\n"); 
    } 

    if(returnValue == ERROR_GEN_FAILURE) { 
     printf("ERROR_GEN_FAILURE\n"); 
    } 

    if(returnValue == ERROR_INVALID_PARAMETER) { 
     printf("ERROR_INVALID_PARAMETER\n"); 
    } 

    if(returnValue == ERROR_INVALID_USER_BUFFER) { 
     printf("ERROR_INVALID_USER_BUFFER\n"); 
    } 

    if(returnValue == ERROR_NOT_FOUND) { 
     printf("ERROR_NOT_FOUND\n"); 
    } 

    if(returnValue == ERROR_NOT_SUPPORTED) { 
     printf("ERROR_NOT_SUPPORTED\n"); 
    } 
} 
BYTE *bMacAddr = (BYTE *) &DestMacAddr; 

return bMacAddr; 

}

我想這可能是因爲它是網絡字節順序或東西,但nothl()沒有工作,要麼:/請幫我在這裏:/

回答

1

你不能做到這一點:

BYTE *bMacAddr = (BYTE *) &DestMacAddr; 

return bMacAddr; 

你返回一個指針到一些事情是這樣的堆棧你GetMacAddress()函數,函數結束時將要消失的。

+0

那我該怎麼辦?我需要返回一個數組:/ – Paze 2013-03-07 18:34:16

+1

@Paze讓調用者傳入數組(然後你需要修復所有你需要的.array地址的代碼,例如'memset(&DestMacAddr,0xff,sizeof(DestMacAddr ));'嚴格錯誤,它應該是'memset(DestMacAddr,0xff,sizeof(DestMacAddr));')。或者用malloc動態分配數組並返回。 .e.g'BYTE * p = malloc(sizeof DestMacAddr); memcpy(p,DestMacAddr,sizeof DestMacAddr);返回p;' – nos 2013-03-07 18:41:15

0

類型「ARP - 在命令提示符上查看本地arp表上的筆記本電腦的MAC地址。如果它不同,然後輸入'arp -d'(使用Vista和Win7/8的管理權限)清除ARP表並嘗試使用SendARP App重新檢查MAC。

+0

是啊我的ARP高速緩存告訴我,MAC是我期待的實際的一個:P是一個「真實」又名這個:e0:94:67:18:a7:dc – Paze 2013-03-07 18:27:48

+1

嘗試在GetMacAddress中打印bMacAddr功能。當DestMacAddr處於堆棧狀態時,看看你得到了什麼結果,並在它離開其功能範圍後被銷燬。 – CasperGhost 2013-03-07 18:35:24

+0

哇這是正確的一個哦然後它是因爲它住在堆棧上:D感謝兄弟,你的救星,現在我只需要學習如何返回陣列xD – Paze 2013-03-07 18:39:41