C#个利用snmpSharpnet实现snmp网管系统(出现错误:由于系统缓冲区空间不足或列队已满,不能执行套接字上的操作)。 本帖最后由 qiouyuebanlun 于 2011-01-14 15:24:51 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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;} 数据传输就及时接收到缓冲区清除资源还有其他程序程序导致 http://topic.csdn.net/u/20081103/10/15cdabcd-8e8a-4d41-b70f-118e4121f063.html 上面的连接我进去看了,, 嘿嘿,不过还是没能找到解决的办法, 麻烦明示。 还有你说的其他程序导致的, 这个不太可能,我只开了服务端,而且程序除了与数据库接连之类的代码就剩snmp的了。清除资源要怎么做了? 这个要去问snmpsharpnet的作者,看是不是你的用法有问题。一个简单的方法是在问题发生时看看内存中有多少活动的Socket对象,netstat能看到怎样的网络占用。只有知道具体资源使用状况,才能找到解决方法。 没用过UdpTarget target = new UdpTarget((IPAddress)agent, 161, 1000, 1);我一直用SimpleSnmp接口管理4w台设备,从未出过问题话说target.RequestAsync(pdu, param, callback);里的callback你不用自己写一个相同签名的方法吗?直接传了个委托的实例是想干嘛!? 看来lz和ls都不看人家源代码的。因为UdpTarget内部实现使用了Socket对象,所以作者设置这个为IDisposable。所以lz使用的时候应该记得用Dispose方法,或者使用using来及时释放资源。直接用SimpleSnmp那只是入门级的,人家作者已经帮你释放了资源了。自己看代码。 这块是直接传了个委托的实例。我是在主线程的类里面 //设置SNMP接收异步调用函数 CSnmp.callback = OnReceive; 这样来给委托赋值的。 问题不应该在这。要是问题解决不了的话,估计就得用到simpleSnmp接口了,到时还要请教您。 关于UdpTarget对象 ,根本就能有Dispose(),也不能用using来释放,,, 不好意思, 没有dispose是因为我用的snmpSharpnet版本的问题。 现在问题是, 加上以后,Get()执行第二遍的时候就报错,“未将对象引用设置到对象的实例”!!· 没看过源码,只能猜测UdpTarget target = new UdpTarget((IPAddress)agent, 161, 1000, 1);在多次new的过程中实际内部可能只创建了一个对象,如只存在对161端口的一个监听而手动dispose清除了对象中包含的资源,即socket被释放掉了(这个我不确定)所以“未将对象引用设置到对象的实例”希望没人骂我不负责任,没看源码猜 这么看起来,的确是SimpleSnmp用起来简单多了,而且效率上我觉得也不错,以前在自己电脑上做过测试具体配置就不写了第一次完整调用get大概需要0.047s,后面0.015s,且多线程安全 还是调试吧把snmpsharpnet源码加进你的解决方案调试 WPF如何实现登陆窗口? 关于客户端验证 和服务器端验证 请教... 还是DataGridView中数据格式的问题。。。。 新手问题? ---菜鸟再次提问---如何判断gridview有一空行 c#中怎么刷新frame 设计时,usercontrol的子控件如何获取选择和编辑(控件高手请进) 100分请教:关于即时消息方案的选择与实现 winForm下的文本框输入问题 置剪切板HTML内容,粘贴以后乱码 asp.net 数据库查询问题 Log4net 怎么配置才能显示进程名称而不是进程ID
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;
}
清除资源
还有其他程序程序导致
http://topic.csdn.net/u/20081103/10/15cdabcd-8e8a-4d41-b70f-118e4121f063.html
上面的连接我进去看了,, 嘿嘿,不过还是没能找到解决的办法, 麻烦明示。
还有你说的其他程序导致的, 这个不太可能,我只开了服务端,而且程序除了与数据库接连之类的代码就剩snmp的了。清除资源要怎么做了?
UdpTarget target = new UdpTarget((IPAddress)agent, 161, 1000, 1);
我一直用SimpleSnmp接口
管理4w台设备,从未出过问题话说
target.RequestAsync(pdu, param, callback);
里的callback你不用自己写一个相同签名的方法吗?直接传了个委托的实例是想干嘛!?
看来lz和ls都不看人家源代码的。因为UdpTarget内部实现使用了Socket对象,所以作者设置这个为IDisposable。所以lz使用的时候应该记得用Dispose方法,或者使用using来及时释放资源。直接用SimpleSnmp那只是入门级的,人家作者已经帮你释放了资源了。自己看代码。
这块是直接传了个委托的实例。我是在主线程的类里面 //设置SNMP接收异步调用函数
CSnmp.callback = OnReceive; 这样来给委托赋值的。 问题不应该在这。要是问题解决不了的话,估计就得用到simpleSnmp接口了,到时还要请教您。
关于UdpTarget对象 ,根本就能有Dispose(),也不能用using来释放,,,
UdpTarget target = new UdpTarget((IPAddress)agent, 161, 1000, 1);
在多次new的过程中实际内部可能只创建了一个对象,如只存在对161端口的一个监听
而手动dispose清除了对象中包含的资源,即socket被释放掉了(这个我不确定)
所以“未将对象引用设置到对象的实例”希望没人骂我不负责任,没看源码猜 这么看起来,的确是SimpleSnmp用起来简单多了,而且效率上我觉得也不错,以前在自己电脑上做过测试
具体配置就不写了
第一次完整调用get大概需要0.047s,后面0.015s,且多线程安全