2013-03-07 57 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