【问题标题】:Scannig the local network and get MAC, IP and Hostname in C++ or C# [closed]扫描本地网络并在 C++ 或 C# 中获取 MAC、IP 和主机名 [关闭]
【发布时间】:2023-04-05 02:59:01
【问题描述】:

我很难找到合适的解决方案来解决我的问题,希望您能帮助我。
我想在 Windows 7 环境中扫描本地网络,我必须返回:
- IP
- MAC地址
- 主机名

本地网络中的所有 PC。我在网上看,但我似乎找不到能做到这三个的人。
如果有人知道一个功能或一组功能可以做到这一点,将不胜感激。
我必须在 C++C# 中执行此操作,但如果可能的话,我更喜欢 C++,因为我更擅长它。
提前感谢您的支持。

【问题讨论】:

    标签: c# c++ ip mac-address hostname


    【解决方案1】:

    我用 C++ 为你制作了一个非常基本的原型,让你走上正确的道路。

    但请记住,它根本不安全,并且随时可能发生可怕的故障,您必须进行更多检查以确保主机名不会溢出等。您还必须弄清楚找出你想如何填充char address[][32] 数组,因为这只是提交四个示例 IP。

    ma​​in.h

    #pragma GCC system_header
    
    #include <Winsock2.h>
    #include <iphlpapi.h>
    #include <cstdio>
    
    //#pragma comment(lib, "iphlpapi.lib")
    //#pragma comment(lib, "ws2_32.lib")
    

    ma​​in.cpp

    #include "main.h"
    
    bool get_name(unsigned char* name, char dest[32])
    {
        struct in_addr destip;
        struct hostent* info;
    
        destip.s_addr = inet_addr(dest);
    
        info = gethostbyaddr((char*)&destip, 4, AF_INET);
    
        if (info != NULL)
        {
            strcpy((char*)name, info->h_name);
        }
        else
        {
            return false;
        }
    
        return true;
    }
    
    bool get_mac(unsigned char* mac , char dest[32])
    {
        struct in_addr destip;
        ULONG mac_address[2];
        ULONG mac_address_len = 6;
    
        destip.s_addr = inet_addr(dest);
    
        SendARP((IPAddr)destip.S_un.S_addr, 0, mac_address, &mac_address_len);
    
        if (mac_address_len)
        {
            BYTE* mac_address_buffer = (BYTE*)&mac_address;
            for (int i = 0; i < (int)mac_address_len; i++)
            {
                mac[i] = (char)mac_address_buffer[i];
            }
        }
        else
        {
            return false;
        }
    
        return true;
    }
    
    int main()
    {
        char address[][32] = {{"192.168.1.1"}, {"192.168.1.2"}, {"192.168.1.3"}, {"192.168.1.4"}};
        WSADATA sock;
    
        if (WSAStartup(MAKEWORD(2,2), &sock) != 0)
        {
            printf("Failed to initialise winsock. (%d)\n", WSAGetLastError());
            return 1;
        }
    
        for (int i = 0; i < (int)sizeof(address)/32; i++)
        {
            unsigned char mac[6] = {'\0'};
            unsigned char name[100] = {'\0'};
    
            if (get_mac(mac, address[i]))
            {
                printf("%s : %s : %.2X-%.2X-%.2X-%.2X-%.2X-%.2X\n", address[i], (get_name(name, address[i])) ? (char*)name : "-", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
                fflush(stdout);
            }
        }
    
        printf("\nDone.\n");
        fflush(stdout);
    
        return 0;
    }
    

    输出:

    192.168.1.1 : pfsense.router : 00-40-F4-CC-A4-83
    192.168.1.2 : - : 00-1D-7E-4B-69-BF
    
    Done.
    

    您需要链接 iphlpapi.libws2_32.lib,我使用的是 GCC,所以 pragma comment(lib, "") 不起作用,但如果您使用的是 msvc,您可以取消注释标题中的行。

    【讨论】:

    • 那太好了,我可以使用“使用 send_arp + gethostbyaddr”,如果完成,您的答案,谢谢 :)
    猜你喜欢
    • 1970-01-01
    • 2012-09-29
    • 2019-05-18
    • 2013-02-17
    • 2011-06-21
    • 1970-01-01
    • 2015-11-18
    • 2015-05-01
    • 2017-02-21
    相关资源
    最近更新 更多