Snmp协议应用-扫描局域网内打印机

Snmp协议简单介绍

简单网络管理协议(SNMP),由一组网络管理的标准组成,包含一个应用层协议(application layer protocol)、数据库模型(database schema)和一组资源对象。该协议能够支持网络管理系统,用以监测连接到网络上的设备是否有任何引起管理上关注的情况。该协议是互联网工程工作小组(IETF,Internet Engineering Task Force)定义的internet协议簇的一部分。SNMP的目标是管理互联网Internet上众多厂家生产的软硬件平台,因此SNMP受Internet标准网络管理框架的影响也很大。SNMP已经出到第三个版本的协议,其功能较以前已经大大地加强和改进了。

详细信息可网上查找,参考http://www.cnblogs.com/zhangsf/archive/2013/08/26/3283124.html

代码部分

代码在Linux虚拟机(1cpu、1GB内存)上运行较慢,将for替换为Parallel后速度有所提升。

public class ScanIpAddress
{
CountdownEvent countdown = null;
int region = ;
string[] oids = null;
public Dictionary<string, List<string>> dicOid = null;
public ScanIpAddress(int region,string[] oids)
{
this.region = region;
this.oids = oids;
this.dicOid = new Dictionary<string, List<string>>();
}
private bool getSnmp(string host)
{
bool result = false;
/* Get an SNMP Object
*/
SimpleSnmp snmpVerb = new SimpleSnmp(host, , "public", , );
if (!snmpVerb.Valid)
{
Console.WriteLine("Seems that IP or comunauty is not cool");
return result;
} //Oid varbind = new Oid(OID); Dictionary<Oid, AsnType> snmpDataS = snmpVerb.Get(SnmpVersion.Ver1, this.oids);
if (snmpDataS != null)
{
List<string> oidList = new List<string> ();
foreach (var item in snmpDataS)
{
oidList.Add(item.Value.ToString());
}
this.dicOid.Add(host, oidList);
result = true;
} return result;
} private void p_PingCompleted(object sender, PingCompletedEventArgs e)
{
string ip = (string)e.UserState;
if (e.Reply != null && e.Reply.Status == IPStatus.Success)
{
/* PRINTER-PORT-MONITOR-MIB - 1.3.6.1.4.1.2699
* ppmPrinterIEEE1284DeviceId: 1.3.6.1.4.1.2699.1.2.1.2.1.1.3
*/
getSnmp(ip);
}
else if (e.Reply == null)
{
Console.WriteLine("Pinging {0} failed. (Null Reply object?)", ip);
}
countdown.Signal();
} public void ScanPrinters()
{
Console.WriteLine("ScanPrinters");
countdown = new CountdownEvent();
Stopwatch sw = new Stopwatch();
sw.Start();
string ipBase = "192.168.{0}.{1}";
Parallel.For(, , (i) =>
{
string ip = string.Format(ipBase, region, i);
Console.WriteLine(ip);
Ping p = new Ping();
p.PingCompleted += new PingCompletedEventHandler(p_PingCompleted);
countdown.AddCount();
p.SendAsync(ip, , ip);
});
//for (int i = 0; i <= 255; i++)
//{
// string ip = string.Format(ipBase, region, i);
// Console.WriteLine(ip);
// Ping p = new Ping();
// p.PingCompleted += new PingCompletedEventHandler(p_PingCompleted);
// countdown.AddCount();
// p.SendAsync(ip, 100, ip);
//}
countdown.Signal();
countdown.Wait();
sw.Stop();
Console.WriteLine("共耗时(毫秒):" + sw.ElapsedMilliseconds);
Console.WriteLine("Printer scan finished");
}
}

调用部分:

    class Program
{
public static string oIDProductName = "1.3.6.1.2.1.25.3.2.1.3.1";// "1.3.6.1.2.1.43.5.1.1.16.1";
public static string oIDSerialNumber = "1.3.6.1.2.1.43.5.1.1.17.1";
static void Main(string[] args)
{
List<string> list = new List<string>();
list.Add(oIDProductName);
list.Add(oIDSerialNumber); ScanIpAddress sip = new ScanIpAddress(, list.ToArray());
sip.ScanPrinters();
if (sip.dicOid != null && sip.dicOid.Count > )
{
foreach (var item in sip.dicOid)
{
Console.WriteLine(item.Key);
List<string> oidList = item.Value;
string printName = string.Empty;
foreach (var str in oidList)
{
printName += str.Replace(" ", "");
Console.WriteLine(str);
}
string [] arr = item.Key.Split('.');
//CupsPrint.AddPrint(arr[2] + arr[3], item.Key);
}
}
Console.ReadLine();
}

Snmp协议应用-扫描局域网内打印机的更多相关文章

  1. wifi智能插座 一键扫描局域网内插座Ip及其它信息 Python源代码API

    转载请保留原地址. http://www.cnblogs.com/lsqandzy 最近买了几个智能插座玩,插座安装在家里,连接好wifi,不管你人在哪里,通过手机,一键开启或关闭插座电源,想象一下, ...

  2. 扫描局域网内的ip和主机名

    1. 目的 今天发现我配置的一台电脑ip被人占用了,所以准备写个程序扫描一下局域网内所有正在使用的ip和主机名 2. 实现--直接上代码 import time import threading im ...

  3. c# asp.net 鼠标改变控件坐标位置,更改控件坐标,注册表保存读取,打印,查找局域网内打印机等等收集

    界面虽然被我弄的很难看,但功能还可以 里边注册表的路径自己设置一下,或者加一个创建注册表的语句,不然会报错 前台: <%@ Page Language="C#" AutoEv ...

  4. 指定端口号,多线程扫描局域网内IP地址

    小白第一次发博客,请各路大神不要喷,有错的地方还请不吝啬指教,谢谢....... 因为注释基本上已经说清楚啦,在这里就不多说什么啦,知识不够怕误人子弟 # -*- coding:utf-8 -*-im ...

  5. Linux下通过nmap扫描局域网内设备,获取ip地址和mac地址

    安装nmap sudo apt-get install nmap 扫描  sudo nmap -sP -PI -PT

  6. 扫描局域网内所有主机和MAC地址的Shell脚本

    #!/bin/bash #author: InBi #date: 2011-08-16 #website: http://www.itwhy.org/2011/08-20/939.html ##### ...

  7. ICMP协议 广播以查询局域网内的所有主机

    看到了很多局域网内的主机扫描工具,在想怎么去实现这样一个工具.前几天看了Ping源码--ICMP协议的实例,ICMP可以用来探测网联网内的任一主机,ICMP和广播地址结合来扫描局域网内的所有主机不是很 ...

  8. 局域网内通过UDP协议进行传输接受数据——AsyncUdpSocket

    在相同的局域网内,可以通过Udp协议进行数据的传输和接收,Udp协议与Http协议不同,Udp更加方便快捷,省去了很多步骤,但是也有很多传输问题,在局域网内小范围传输数据时Udp还是非常能够胜任的. ...

  9. win10调用局域网内xp系统上的打印机

    首先在xp系统上配置允许远程连接,然后设置账户密码,最后配置打印机,允许共享. 打开自己win10 ,win+R ,输入\\目标电脑ip\打印机名,确定,输入账户,密码. win+X - P-进入控制 ...

随机推荐

  1. Android 动画详解

    这次主要就介绍android动画,android动画目前分为三种形式,Tween Animation 这个只能应用于view对象上面的,Drawable Animation这个是帧动画,就是类似我们有 ...

  2. django TEMPLATES

    ?: (1_8.W001) The standalone TEMPLATE_* settings were deprecated in Django 1.8 and the TEMPLATES dic ...

  3. Robot Framework入门学习2 创建第一个测试用例

    本文章部分内容引自以下网址,感谢作者的辛苦分享 http://www.cnblogs.com/fnng/p/3871712.html http://blog.csdn.net/tulituqi/art ...

  4. Robot Framework入门学习1 安装部署详解

    安装注意: 目前Robot framework-ride不支持python3,安装时请下载python2.7版本. Robot Framework安装时出现了一点小问题,网上没有找到直接的介绍,现将安 ...

  5. IntelliJ 支持web

  6. QlikView 权限设置问题和注意

    企业级报表通常都涉及到复杂的权限问题, 比如文本级权限和行级权限,某区域经理只能看到该区域的销售数据.QlikView自然也提供了该种功能. 具体方法: 在Edit script中新建一个tab, 输 ...

  7. PHP获取当前服务器信息的基本语句

    下面是PHP获取当前服务器信息的基本语句. PHP程式版本: <?PHP echo PHP_VERSION; ?> ZEND版本: <?PHP echo zend_version() ...

  8. C# 如何给sql数据库的日期字段插入空值

    在C#中声明日期变量时用SqlDateTime类型,引用:using System.Data.SqlTypes; 例子:user.AbortDate = SqlDateTime.Null;

  9. SQL Server 大数据量分页建议方案

    简单的说就是这个 select top(20) * from( select *, rowid = row_number() over(order by xxx) from tb with(noloc ...

  10. 【转】linux yum命令详解

    yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能够从指定的服务器自动下载RP ...