You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 03:36:09