资讯详情

资讯详情

VC源码实战:30秒扫描局域网IP与MAC地址工具解析

简介这是一份面向网络管理与安全初学者的VC局域网扫描工具源码用于快速发现同一网段内所有主机的IP与MAC地址可服务于网络设备盘点、IP冲突排查与未授权设备识别等场景。压缩包共15个文件以h头文件与cpp源文件为主辅以rc资源脚本、dsw/dsp工程文件、ico图标及clw类向导文件整体仅13KB结构紧凑便于在Visual C环境中直接打开编译与二次开发。资源已有733人学习下载说明其在局域网扫描这一经典需求上具备一定参考价值。读者可从中获取ARP/ICMP探测思路、网卡物理地址与逻辑地址的对应采集方法以及基于MFC对话框的扫描程序组织方式适合作为网络编程入门练手或课程设计参考素材。1. 三十秒扫完一个网段这套 VC 源码到底能拿到什么手上只有一台笔记本接进一个完全陌生的交换机想知道这个网段里到底挂了多少台设备、每台的 IP 和 MAC 各是什么——这种场景下很多人第一反应是去装个现成的扫描器但如果你手头正好有一份 VC 工程源码事情会简单很多。ScanLanByIPC 就是这样一个东西一个用 Visual C 写的局域网扫描程序作者标称 30 秒能扫完一个 C 类网段的 255 台机子输出每台在线设备的 IP 和 MAC 地址。它不是什么商业级网管平台就是一个能编译、能跑、能改的小工具适合做网络管理、故障排查、IP 冲突定位也适合拿来做二次开发的学习底子。我拿到这份源码包的时候第一件事不是急着编译而是先看它到底怎么发现设备。局域网里拿 IP 和 MAC绕不开两个协议ARP 和 ICMP。ICMP 能告诉你某台机器活着但拿不到 MACARP 才是真正把 IP 和物理地址绑在一起的那一层。这个工具的核心逻辑大概率就是构造 ARP 请求广播出去然后收回应答从应答里解析出 IP 和 MAC 的对应关系。理解这一点后面看代码、调参数、排错才有方向。2. 从工程文件到可执行程序编译链路与目录结构拆解2.1 先认清这套 VC6 工程的骨架把压缩包解开你会看到一堆典型的 VC6 工程文件。别被数量吓到真正决定程序行为的就那么几个。先按类型分一下文件作用ScanLanByIPC.dsw工作区文件VC6 用它来组织多个工程ScanLanByIPC.dsp单个工程文件记录编译选项、依赖、源文件列表ScanLanByIPCDlg.cpp / .h主对话框逻辑扫描的触发和结果展示大概率在这里ScanLanByIPC.cpp / .h应用程序入口MFC 的初始化流程IPCSendFile.cpp / .h看名字和进程间通信、文件发送有关可能是辅助功能StdAfx.cpp / .h预编译头VC6 标配Resource.h / .rc / .rc2 / .ico资源定义界面、图标、字符串表ScanLanByIPC.clwClassWizard 的类信息文件不影响编译这套结构是典型的 MFC 对话框程序。ScanLanByIPCDlg.cpp是重点扫描逻辑、线程调度、结果填充基本都在这里。IPCSendFile这个模块值得留意它暗示程序除了扫描可能还带了点进程间通信或文件传输的边角功能但核心还是扫描。2.2 用 VC6 或 VS 打开并编译如果你手头有 Visual C 6.0直接双击.dsw就能打开。没有 VC6 的话用 Visual Studio 2010 到 2017 之间的版本也能打开但需要走一次工程升级向导。再新的 VS 版本对 VC6 工程的支持就很差了不建议硬上。编译步骤# 如果你用命令行编译需要 VC6 或兼容的 nmake 环境 # 先进入工程目录 cd ScanLanByIPC # 用 nmake 编译具体 makefile 名称看工程实际生成 nmake /f ScanLanByIPC.mak CFGScanLanByIPC - Win32 Release不过大多数情况下直接在 IDE 里点 Build 更省事。编译时注意几个点字符集VC6 默认是 MBCS不是 Unicode。如果你用新版 VS 打开它可能会提示你升级字符集别升保持 MBCS否则字符串处理部分可能出问题。MFC 版本工程用的是 VC6 自带的 MFC 4.2新版 VS 的 MFC 版本不兼容强行升级会报一堆链接错误。平台工具集如果非要用新版 VS把平台工具集改成 v100 或 v110 试试但成功率不高。编译通过后会在 Release 或 Debug 目录下生成ScanLanByIPC.exe。这个 exe 就是你要的扫描器。2.3 扫描逻辑的核心ARP 请求怎么发、怎么收虽然源码里具体实现要打开ScanLanByIPCDlg.cpp才能确认但这类工具的标准做法是走 Windows 的SendARPAPI或者自己构造 ARP 包用WinPcap发。从工程文件列表里没看到 WinPcap 的依赖所以更可能是用SendARP。SendARP的用法大致是这样// 假设目标 IP 是 192.168.1.1 ULONG destIp inet_addr(192.168.1.1); ULONG macAddr[2] {0}; ULONG macLen 6; DWORD ret SendARP(destIp, 0, macAddr, macLen); if (ret NO_ERROR) { BYTE* mac (BYTE*)macAddr; // mac[0] 到 mac[5] 就是 MAC 地址的六个字节 // 格式化成 XX-XX-XX-XX-XX-XX 输出 }这段代码的逻辑是向目标 IP 发一个 ARP 请求如果对方在线并且响应了macAddr里就会填入对方的 MAC。SendARP是同步的发出去等回应超时时间由系统控制一般几百毫秒。扫 255 个地址如果串行发每个等 200 毫秒那就是 51 秒和作者说的 30 秒有差距。所以源码里大概率用了多线程或者异步发送来加速。参数说明destIp目标 IP用inet_addr把点分十进制转成 ULONG。第二个参数是源 IP填 0 表示由系统自动选。macAddr输出缓冲区至少 6 字节。macLen输入时填缓冲区大小输出时是实际写入的字节数。如果你要改扫描范围比如从 192.168.1.0/24 改成 192.168.0.0/24就得找到代码里拼接 IP 的地方把网段前缀换掉。常见做法是用一个循环从 1 到 254 拼出完整 IP。2.4 多线程加速30 秒扫完 255 台的关键串行扫太慢所以这类工具通常会开线程池。比如开 10 个线程每个线程负责 25 个 IP同时发 ARP 请求总耗时就能压到几秒到十几秒。源码里如果用了AfxBeginThread或者CreateThread那就是这个思路。改线程数的时候注意线程不是越多越好。Windows 对并发 ARP 请求的处理能力有限开太多线程反而会因为资源竞争导致丢包有些机器就扫不到了。我一般会把线程数控制在 20 到 50 之间具体看网段大小和交换机性能。如果是 255 台的小网段20 个线程足够。还有一个细节SendARP的超时是系统级的改不了。如果某台机器不在线每次调用都要等超时才能返回这会拖慢整体速度。优化办法是先把所有 IP 的 ARP 请求都发出去然后再统一收结果而不是发一个等一个。这需要自己构造 ARP 包用WinPcap或者原始套接字复杂度高不少。源码里如果没这么做那 30 秒的标称值可能是在理想网络环境下测出来的。3. 跑起来之后结果解读、IP 冲突排查与常见翻车点3.1 扫描结果怎么看程序跑完界面上一般会列出一张表IP 地址、MAC 地址可能还有主机名如果做了反向解析。重点看两列IP 和 MAC 是不是一一对应。如果同一个 MAC 对应多个 IP说明这台机器配了多个 IP或者有人在搞 ARP 欺骗。有没有你认识的设备。陌生 MAC 出现在你的网段里要么是有人私接设备要么是虚拟机桥接模式没设好。MAC 地址的前三个字节是 OUI代表厂商。比如00-1A-2B可能是某家的网卡。你可以拿这个去查厂商库快速判断设备类型。常见做法是本地存一份 OUI 表扫描完自动匹配。3.2 IP 冲突怎么用这个工具定位IP 冲突的典型现象是两台机器配了同一个 IP网络时通时断。用 ScanLan 扫一遍如果发现同一个 IP 对应了两个不同的 MAC或者扫描结果里某个 IP 的 MAC 频繁变化那就是冲突了。定位步骤先扫一遍记下冲突 IP 对应的 MAC。在交换机上查这个 MAC 挂在哪个端口。顺着端口找到物理机器改掉其中一台的 IP。如果没有网管交换机那就只能靠逐台断开法拔掉一台再扫看冲突 IP 的 MAC 变没变。3.3 避坑与常见问题排查现象一扫描结果为空一台设备都扫不到。原因程序可能绑定了错误的网卡。如果机器有多张网卡有线、无线、虚拟网卡SendARP默认走路由表选的那张不一定是你要扫的那张。 解决在代码里显式指定源 IP或者临时禁用其他网卡只留目标网段的那张。现象二部分设备扫不到但明明在线。原因对方开了防火墙屏蔽了 ARP 请求。或者对方是跨网段设备ARP 广播到不了。 解决ARP 是二层协议跨网段扫不到是正常的。防火墙屏蔽 ARP 的情况比较少见但有些安全软件会这么做。可以试试用 ICMP 先探活再对活的 IP 发 ARP。现象三编译报错提示找不到 MFC42D.DLL 或类似。原因VC6 的调试版 MFC 库在新系统上缺失。 解决编译 Release 版不要用 Debug 版。Release 版依赖的是 MFC42.DLL系统自带。现象四程序在 Win10/Win11 上跑不起来闪退。原因VC6 编译的程序对新高版本 Windows 的兼容性有问题尤其是 UAC 和 DEP。 解决右键 exe设置兼容性模式为 Windows XP SP3并以管理员身份运行。如果还不行就得用新版 VS 重新编译但工程升级的坑不少。现象五扫描速度远慢于 30 秒。原因线程数设得太少或者网络里有大量不在线的 IP每个都要等超时。 解决加大线程数或者改成分批发送、统一接收的模式。另外把扫描范围缩小到实际使用的网段别扫整个 255。4. 二次开发与进阶把扫描结果接进你自己的工具链4.1 把扫描逻辑抽出来做成独立模块如果你不想每次都用这个 GUI 程序可以把ScanLanByIPCDlg.cpp里的扫描函数抽出来做成一个独立的 DLL 或静态库。核心就是那个循环发SendARP的函数把它从 MFC 的对话框类里剥离改成纯 Win32 API 调用就能在任何 C 项目里用。抽离的时候注意原代码可能用了 MFC 的CString和集合类这些在非 MFC 环境里用不了。换成std::string和std::vector工作量不大但能让你在控制台程序或服务里直接调。4.2 扫描结果导出与自动化GUI 程序的结果一般只能看不方便后续处理。我一般会加一个导出功能把 IP 和 MAC 写成 CSV// 假设 results 是一个 vectorpairstring, string // first 是 IPsecond 是 MAC FILE* fp fopen(scan_result.csv, w); fprintf(fp, IP,MAC\n); for (auto item : results) { fprintf(fp, %s,%s\n, item.first.c_str(), item.second.c_str()); } fclose(fp);有了 CSV就能用 Excel 或脚本做进一步分析比如对比历史扫描结果发现新接入的设备。这个习惯帮我省了很多事每次扫完存一份下次再扫diff 一下就知道谁偷偷接了网线。4.3 验证扫描准确性的方法怎么知道扫出来的结果是对的我一般用两个办法交叉验证在目标机器上跑ipconfig /all看它的 MAC 是不是和扫描结果一致。用arp -a看本机的 ARP 缓存和扫描结果对比。如果扫描结果比arp -a多说明扫描确实主动探测了不是只读缓存。如果两者不一致优先信ipconfig因为那是设备自己报的。扫描结果可能因为网络延迟或 ARP 缓存过期而不准。4.4 一个我踩过的坑有一次在客户现场扫出来的 MAC 全是00-00-00-00-00-00。查了半天发现是虚拟网卡在作怪——那台机器装了 VMware虚拟网卡抢了路由优先级SendARP全发到虚拟网段去了。从那以后我每次跑扫描之前都强制先route print看一眼路由表确认默认路由走的是哪张网卡。这个习惯帮我避开了至少三次类似的翻车。希望帮到你。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →