扫描本地网络,并获得MAC, IP和主机名在c++或c#
Scannig the local network and get MAC, IP and Hostname in C++ or C#
我在找一个合适的方法来解决我的问题,希望你能帮助我。
我想在Windows 7环境下扫描本地网络,我必须返回:
——IP
- MAC地址
——主机名
本地网络中所有的PC机。我在网上找,但我似乎找不到能做这三件事的人。
如果有人知道一个函数或一组函数可以做到这一点,那将是非常感激的。
我必须在 c++ 或 c# 中这样做,但如果可能的话,我宁愿选择c++,因为我更擅长它。提前感谢您的支持
我用c++为你做了一个非常基本的原型,让你走上正确的道路。
但请记住,这是不安全的,它可以在任何一秒可怕的失败,你必须做一些更多的检查,以确保主机名没有溢出等。你还必须弄清楚如何填充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] = {' '};
unsigned char name[100] = {' '};
if (get_mac(mac, address[i]))
{
printf("%s : %s : %.2X-%.2X-%.2X-%.2X-%.2X-%.2Xn", 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,你可以取消注释头中的行。
相关文章:
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 如何停止 CLR 主机?
- 如何强制 Thrift 仅接受来自本地主机的连接
- 库达如何将字符**从内核复制到主机
- Poco::Net::FTPClientSession 在 open() 方法上挂起 129 秒,如果 ftp 主机不存
- 如何在 2 台主机之间保持 UDP 套接字连接打开
- 如何在 cuda 中将 kd 树从主机复制到驱动程序
- Poco 库 PUT 方法未按预期工作,尽管主机、方法、内容类型设置正确
- OpenCL 错误类在主机C++给出错误
- 来自复杂主机数据的阵列火力阵列
- 分离库的主机端和 CUDA 设备端版本
- 如何将HTTPS流量重定向到本地主机:443上的代理?
- Cesanta Mongoose - 连接到本地主机时出现问题
- C++ / Qt:如何检测主机名或IP地址何时引用当前系统?
- 如何实现从 Windows 脚本主机到脚本的事件调度
- 下载 GPU Mats 的矢量到主机
- 为什么主机不显示?(C++和代码处理器问题)
- 从C++中的主机名获取计算机名
- 如何使用PHP将上传到本地主机的一个html文件重定向到磁盘上的另一个html文档