1

我试图在我的局域网上检索设备的 mac 地址,我使用 SendARP 函数来执行此操作,但由于某种奇怪的原因,它给了我错误的 mac 地址,我告诉它获取我的笔记本电脑的 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 SendARP 的 Mac 输出: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() 也不起作用:/请在这里帮助我:/

4

2 回答 2

1

You can't do this:

BYTE *bMacAddr = (BYTE *) &DestMacAddr;

return bMacAddr;

You're returning a pointer to some thing that's on the stack of your GetMacAddress() function, which will be gone when the function ends.

于 2013-03-07T18:27:07.503 回答
0

在命令提示符下键入“arp -a”以查看本地 arp 表中笔记本电脑的 MAC 地址是什么。如果它与原来的不同,则键入“arp -d”(在 Vista 和 Win7/8 上具有管理员权限)以清除 arp 表并尝试使用 yo SendARP 应用程序再次检查 mac。

于 2013-03-07T18:19:37.727 回答