使用SnmpSharpNet读取文本IP批量执行SNMP检测的实现方法
问题根因
你遇到的问题和SnmpSharpNet能力无关,纯是代码逻辑写错了:
- 所有SNMP连通性校验、数据请求逻辑全写在了foreach循环外部,循环内只做了SimpleSnmp实例化,既不校验也不发请求,每次循环还会覆盖上一个IP的实例,最后执行请求的时候根本没有遍历所有IP。
- 变量名引用错误:循环内实例名叫
ipAddress,后面校验用的是IpAddress(是SnmpSharpNet的类名,不是你实例化的对象),这段代码实际连编译都过不了。 - 没有做异常捕获和输入清洗:文本里有空行、非法IP、前后空格的话,实例化直接抛异常,整个程序直接中断;单个IP超时也会卡住整个流程。
Console.ReadLine()写在循环内,每测一个IP就要手动按一次回车,根本跑不了批量。
修正后的可运行代码
把所有单IP的检测逻辑全部移到循环内部,加上输入过滤、异常捕获、超时配置,代码如下:
using SnmpSharpNet; using System.Net; namespace SNMPCheck { class Program { static void Main(string[] args) { // 配置项统一抽离,方便后续修改 int snmpPort = 161; string readCommunity = "public"; int timeoutMs = 2000; int retryCount = 1; Oid sysNameOid = new Oid("1.3.6.1.2.1.1.5.0"); string ipFilePath = @"c:\co1.txt"; // 读取IP列表,过滤空行、非法IP格式行 var ipList = File.ReadLines(ipFilePath) .Select(line => line.Trim()) .Where(line => !string.IsNullOrEmpty(line) && IPAddress.TryParse(line, out _)) .ToList(); Console.WriteLine($"共加载有效IP {ipList.Count} 个,开始检测"); foreach (string ip in ipList) { try { // 每个IP单独初始化SNMP客户端,配置超时和重试 using (var snmpClient = new SimpleSnmp(ip, snmpPort, readCommunity)) { snmpClient.Timeout = timeoutMs; snmpClient.Retry = retryCount; if (!snmpClient.Valid) { Console.WriteLine($"[{ip}] 连通失败:团体字不匹配或端口不可达"); continue; } // 发送SNMP Get请求 var snmpResult = snmpClient.Get(SnmpVersion.Ver2, new[] { sysNameOid.ToString() }); if (snmpResult != null && snmpResult.TryGetValue(sysNameOid, out var sysNameValue)) { Console.WriteLine($"[{ip}] 系统名称:{sysNameValue}"); } else { Console.WriteLine($"[{ip}] 请求失败:无有效返回数据"); } } } catch (Exception ex) { Console.WriteLine($"[{ip}] 检测异常:{ex.Message}"); } } Console.WriteLine("所有IP检测完成,按任意键退出"); Console.ReadLine(); } } }
SnmpSharpNet替代方案说明
SnmpSharpNet本身完全支持多IP批量检测,不存在“无法从多个代理获取返回数据”的限制,你遇到的是实现逻辑错误。如果要选替代类库,目前生态最成熟的是#SNMP Library:
- 开源免费,API设计更符合现代.NET编码习惯,支持.NET Framework/.NET Core/.NET 5+全版本
- 完整支持SNMP v1/v2c/v3,文档和示例更全,目前仍在持续维护
- SnmpSharpNet最后一次稳定更新是2020年,仅适合维护老项目,新项目优先选#SNMP即可。
批量检测优化提示
- 如果IP量超过20个,不要用同步串行遍历,可以用
Parallel.ForEach加并发度控制(建议并发数控制在10-20之间),能大幅提升检测速度,避免单个IP超时拖慢整体进度。 - 读IP文件不需要调用
ToArray()全量加载到内存,直接用File.ReadLines逐行枚举即可,大文件场景下内存占用更低。 - 不要硬编码团体字,生产环境不同设备可能用不同的读团体字,可以把IP、端口、团体字做成CSV配置文件逐行读取。
内容的提问来源于stack exchange,提问作者Elliot Alderson
相关产品推荐
相关产品推荐

