- 需求:
探测当前局域网内的所有在线设备
- 设计想法
a. 采用TCP探测的方法, 经实践后,发现实现复杂遂放弃
b. 采用UDP广播的方式,实践后发现,有些设备接受不到UDP广播,由于进度原因未做深入探究
c. 采用ARP广播,获得所欲在局域网内的设备,然后发生身份确认消息包,得到确认的确定为在线设备。
- 结论
ARP广播探测效率任然不够理想,遇到这样的问题,代码中使用了windows提供的官方函数SendARP(), 经实际测试发现,多线程的情况下,会低概率的出现设备在线但无法探测到的现象,很想知道是什么原因,若是找到答案,希望可以不吝赐教。
- 实现代码
以下为基于第三种想法实现的代码
#include <windows.h>
#include <stdio.h>
#include <iphlpapi.h>
#include <functional>
#pragma comment (lib,"ws2_32.lib")
#pragma comment (lib,"iphlpapi.lib")
// 扫描网络
void ScanningNetWork4Onlin()
{
// 初始化socket
WSADATA data;
WORD wVersion = MAKEWORD(2, 2);
WSAStartup(wVersion, &data);
hostent *pLocalHost;
HANDLE hEvent;
// 获得本机IP结构
pLocalHost