-1

私の問題に対する適切な解決策を見つけるのに苦労しています。あなたが私を助けてくれることを願っています. Windows 7環境でローカル ネットワークをスキャンし
たいのですが、返す必要があります: - IP - MAC アドレス- ローカル ネットワーク内のすべての PC の ホスト名。ネットで調べたのですが、その3つをやってくれる人が見つからないようです。 誰かがトリックを行うことができる関数または関数のグループを知っていれば、それは大歓迎です。 私はこれをC++またはC#で行う必要がありますが、可能であれば、私は C++ の方が得意なので、むしろ C++ を好みます。 ご支援いただきありがとうございます。






4

1 に答える 1

3

正しい道をたどるために、C++ で非常に基本的なプロトタイプを作成しました。

ただし、まったく安全ではなく、いつでも恐ろしく失敗する可能性があることに注意してください。ホスト名がオーバーフローしないように、さらにチェックを行う必要があります。char address[][32]これは 4 つの例の IP を渡すだけなので、配列を埋める必要があります。

main.h :

#pragma GCC system_header

#include <Winsock2.h>
#include <iphlpapi.h>
#include <cstdio>

//#pragma comment(lib, "iphlpapi.lib")
//#pragma comment(lib, "ws2_32.lib")

main.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を使用している場合は、ヘッダーの行のコメントを外すことができます.

于 2013-05-11T10:47:18.723 に答える