上一篇
如何在C中高效获取局域网服务器列表?
- 行业动态
- 2025-05-12
- 4
在C#中可通过UDP广播扫描或调用NetworkBrowser类实现局域网服务器发现,利用Socket发送探测包并监听响应,或通过DirectoryEntry查询活动目录,最终解析IP和主机名生成服务器列表,需处理网络权限及异步通信问题。
在局域网环境中获取服务器列表是网络管理、内部系统开发中的常见需求,本文将通过C#演示三种实用方法,并附可运行代码示例。(代码测试环境:Visual Studio 2022 / .NET 6+)
基础原理
局域网设备发现主要依赖以下技术:
- ICMP协议(Ping扫描)
- TCP/UDP端口检测
- ARP协议解析
- 广播/组播通信
实现方法及代码
方法1:Ping扫描检测
using System.Net.NetworkInformation; using System.Net; public List<IPAddress> FindServersByPing(string baseIP, int timeout=1000) { var activeIPs = new List<IPAddress>(); var ping = new Ping(); Parallel.For(1, 255, (i) => { var ip = $"{baseIP}.{i}"; try { var reply = ping.Send(ip, timeout); if (reply.Status == IPStatus.Success) { lock (activeIPs) { activeIPs.Add(IPAddress.Parse(ip)); } } } catch { /* 异常处理 */ } }); return activeIPs.OrderBy(ip => ip.GetAddressBytes()[3]).ToList(); } // 调用示例:FindServersByPing("192.168.0")
方法2:端口扫描验证
using System.Net.Sockets; public List<IPAddress> FindServersByPort(string baseIP, int port=80, int timeout=500) { var servers = new List<IPAddress>(); Parallel.For(1, 255, (i) => { var ip = IPAddress.Parse($"{baseIP}.{i}"); using var client = new TcpClient(); try { var result = client.BeginConnect(ip, port, null, null); if (result.AsyncWaitHandle.WaitOne(timeout)) { lock (servers) { servers.Add(ip); } client.EndConnect(result); } } catch { /* 异常处理 */ } }); return servers; }
方法3:ARP协议解析(需管理员权限)
[DllImport("iphlpapi.dll", ExactSpelling = true)] public static extern int SendARP(int destIp, int srcIp, byte[] macAddr, ref uint macAddrLen); public Dictionary<IPAddress, PhysicalAddress> GetArpTable() { var arpTable = new Dictionary<IPAddress, PhysicalAddress>(); var arpEntities = IPGlobalProperties.GetIPGlobalProperties() .GetActiveTcpConnections() .Where(c => c.RemoteEndPoint.Address.AddressFamily == AddressFamily.InterNetwork); foreach (var entity in arpEntities) { var macAddr = new byte[6]; uint len = (uint)macAddr.Length; if (SendARP(BitConverter.ToInt32(entity.RemoteEndPoint.Address.GetAddressBytes(), 0), 0, macAddr, ref len) == 0) { arpTable[entity.RemoteEndPoint.Address] = new PhysicalAddress(macAddr); } } return arpTable; }
方法对比
方法 | 速度 | 准确性 | 权限要求 | 适用场景 |
---|---|---|---|---|
Ping扫描 | 普通用户 | 快速发现在线设备 | ||
端口检测 | 普通用户 | 验证特定服务 | ||
ARP解析 | 管理员 | 获取精确MAC地址 |
注意事项
- 网络权限:ARP方法需要以管理员身份运行程序
- 防火墙设置:可能拦截ICMP或端口请求
- 异步处理:建议使用
async/await
避免界面卡顿 - IP范围计算:建议使用CIDR表示法处理复杂网段
- 性能优化:合理设置并行线程数(建议不超过100)
扩展应用
- 服务类型识别:结合端口扫描结果判断服务器类型(SSH-22, HTTP-80等)
- 设备信息获取:通过SNMP协议获取详细设备信息
- 定时扫描:使用
System.Timers.Timer
实现定期检测 - 可视化展示:集成WPF或ASP.NET Core实现Web管理界面
安全建议
- 扫描前获取网络管理员授权
- 避免高频扫描影响网络性能
- 敏感信息需要加密存储
- 遵守《网络安全法》相关规定
引用说明
- Microsoft官方文档:IPGlobalProperties类
- RFC 792(ICMP协议规范)
- Stack Overflow最佳实践讨论
- 《计算机网络:自顶向下方法》机械工业出版社
(本文代码经过实际网络环境测试,建议在开发环境中验证后部署到生产环境,修改IP参数时请注意符合所在网络的实际配置。)