我很难找到合适的解决方案来解决我的问题,希望您能帮助我。
我想在Windows 7环境中扫描本地网络,我必须返回:- IP
- MAC 地址-
本地网络中所有 PC 的
主机名。我在网上看,但我似乎找不到能做到这三个的东西。
如果有人知道一个功能或一组功能可以做到这一点,那将不胜感激。
我必须在C++或C#中执行此操作,但如果可能的话,我更喜欢 C++,因为我更擅长它。
预先感谢您的支持。
问问题
5897 次
1 回答
3
我用 C++ 为你制作了一个非常基本的原型,让你走上正确的道路。
但请记住,它根本不安全,并且随时可能发生可怕的故障,您必须进行更多检查以确保主机名不会溢出等。您还必须弄清楚您是如何做到的想要填充char address[][32]
数组,因为这只是提交四个示例 IP。
主.h:
#pragma GCC system_header
#include <Winsock2.h>
#include <iphlpapi.h>
#include <cstdio>
//#pragma comment(lib, "iphlpapi.lib")
//#pragma comment(lib, "ws2_32.lib")
主.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,您可以取消注释标题中的行。
于 2013-05-11T10:47:18.723 回答