Сканирование локальной сети и получение MAC, IP и имени хоста в C ++ или C #

У меня проблемы с поиском подходящего решения моей проблемы, и я надеюсь, что вы мне поможете.
я хочу сканировать локальную сеть в Windows 7 и я должен вернуться
— IP
— MAC-адрес
— имя хоста

Из всех ПК в локальной сети. Я искал в сети, но я не могу найти что-то, кто сделает три из этого.
Если кто-то знает функцию или группу функций, которые могут сделать свое дело, это будет высоко ценится.
Я должен сделать это в C ++ или же C #, но если возможно, я бы предпочел C ++, так как я лучше в этом.
Заранее спасибо за вашу поддержку.

-2

Решение

Я сделал для вас действительно базовый прототип на С ++, чтобы вы могли выбрать правильный путь.

Но имейте в виду, что это вообще небезопасно, и в любой момент может произойти ужасный сбой, вам придется сделать еще несколько проверок, чтобы убедиться, что имя хоста не переполняется и т. Д. И вам также придется выяснить, как вы хочу заполнить char address[][32] массив, потому что это просто передать четыре примера 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.lib а также ws2_32.libЯ использую GCC так pragma comment(lib, "") не будет работать, но если вы используете msvc, вы можете раскомментировать строки в заголовке.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]