本帖最后由 qiouyuebanlun 于 2011-01-14 15:24:51 编辑

解决方案 »

  1.   

    using System;
    using System.Net;
    using SnmpSharpNet;
    using System.Threading;
    using System.Collections.Generic;
    using Server.BLL;/// <summary>
    /// Snmp类
    /// </summary>
    public class CSnmp : DevTask
    {
        /// <summary>
        /// 执行SNMP的Get命令
        /// </summary>
        /// <param name="ip"></param>
        /// <param name="commu"></param>
        /// <param name="oid"></param>
        /// <param name="requestId"></param>
        public void Get(string ip, string commu, OidList oid, int requestId)
        {
            OctetString community = new OctetString(commu);
            AgentParameters param = new AgentParameters(community);
            param.Version = SnmpVersion.Ver1;
            IpAddress agent = new IpAddress(ip);
            try
            {
                UdpTarget target = new UdpTarget((IPAddress)agent, 161, 1000, 1);
    ---------------------------上面这句报错: 由于系统缓冲区空间不足或列队已满,不能执行套接字上的操作.------------------------------------------------------
                Pdu pdu = new Pdu(PduType.Get);
                pdu.RequestId = requestId;
                foreach (string str in oid)
                {
                    pdu.VbList.Add(str);
                }
                target.RequestAsync(pdu, param, callback);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message.ToString());
            }
        }
        /// <summary>
        /// 定义接收异步调用函数的委托
        /// </summary>
        /// <param name="result"></param>
        /// <param name="packet"></param>
        public static SnmpAsyncResponse callback = null;
    }
      

  2.   

    数据传输就及时接收到缓冲区
    清除资源
    还有其他程序程序导致 
    http://topic.csdn.net/u/20081103/10/15cdabcd-8e8a-4d41-b70f-118e4121f063.html
      

  3.   


    上面的连接我进去看了,, 嘿嘿,不过还是没能找到解决的办法, 麻烦明示。
        还有你说的其他程序导致的, 这个不太可能,我只开了服务端,而且程序除了与数据库接连之类的代码就剩snmp的了。清除资源要怎么做了? 
      

  4.   

    这个要去问snmpsharpnet的作者,看是不是你的用法有问题。一个简单的方法是在问题发生时看看内存中有多少活动的Socket对象,netstat能看到怎样的网络占用。只有知道具体资源使用状况,才能找到解决方法。
      

  5.   

    没用过
    UdpTarget target = new UdpTarget((IPAddress)agent, 161, 1000, 1);
    我一直用SimpleSnmp接口
    管理4w台设备,从未出过问题话说
    target.RequestAsync(pdu, param, callback);
    里的callback你不用自己写一个相同签名的方法吗?直接传了个委托的实例是想干嘛!?
      

  6.   


    看来lz和ls都不看人家源代码的。因为UdpTarget内部实现使用了Socket对象,所以作者设置这个为IDisposable。所以lz使用的时候应该记得用Dispose方法,或者使用using来及时释放资源。直接用SimpleSnmp那只是入门级的,人家作者已经帮你释放了资源了。自己看代码。
      

  7.   


    这块是直接传了个委托的实例。我是在主线程的类里面  //设置SNMP接收异步调用函数
            CSnmp.callback = OnReceive; 这样来给委托赋值的。 问题不应该在这。要是问题解决不了的话,估计就得用到simpleSnmp接口了,到时还要请教您。
      

  8.   


    关于UdpTarget对象 ,根本就能有Dispose(),也不能用using来释放,,,
      

  9.   

    不好意思, 没有dispose是因为我用的snmpSharpnet版本的问题。 现在问题是, 加上以后,Get()执行第二遍的时候就报错,“未将对象引用设置到对象的实例”!!·
      

  10.   

     没看过源码,只能猜测
    UdpTarget target = new UdpTarget((IPAddress)agent, 161, 1000, 1);
    在多次new的过程中实际内部可能只创建了一个对象,如只存在对161端口的一个监听
    而手动dispose清除了对象中包含的资源,即socket被释放掉了(这个我不确定)
    所以“未将对象引用设置到对象的实例”希望没人骂我不负责任,没看源码猜  这么看起来,的确是SimpleSnmp用起来简单多了,而且效率上我觉得也不错,以前在自己电脑上做过测试
    具体配置就不写了
    第一次完整调用get大概需要0.047s,后面0.015s,且多线程安全
      

  11.   

    还是调试吧把snmpsharpnet源码加进你的解决方案调试