2014-12-04 4 views
0

Я, имеющий 30 компьютер в моей сети и есть пять сетевых принтеров так, как я могу найти только те пять IP сетевых принтеров через SNMP ... если я перечисляя все IP и использовать SNMP какполучить список IP-SNMP

//OctetString community = new OctetString(arg1); 
OctetString community = new OctetString("public"); 

AgentParameters param = new AgentParameters(community); 
param.Version = SnmpVersion.Ver1; 
//"1.3.6.1.2.1.1.1" 
IpAddress agent = new IpAddress(serv1); 
//in serv1 i pass my ip 


UdpTarget target = new UdpTarget((IPAddress)agent, 161, 2000, 2); 
// target.Timeout = 2000; 
//target.Retry = 4; 

Pdu pdu = new Pdu(PduType.Get); 
pdu.VbList.Add("1.3.6.1.2.1.43.10.2.1.4.1.1");//counter 
pdu.VbList.Add("1.3.6.1.2.1.43.11.1.1.9.1.1"); //black toner level 
pdu.VbList.Add("1.3.6.1.2.1.43.11.1.1.9.1.2"); //Cyan toner level 
pdu.VbList.Add("1.3.6.1.2.1.2.2.1.6.1"); //Mac Address 
pdu.VbList.Add("1.3.6.1.2.1.1.1.0"); 

SnmpV1Packet result = (SnmpV1Packet)target.Request(pdu, param); 

но поиск во всех 30 ф очень медленно ... так, как я могу найти только те 5 ф из моих сетевых принтеров

+0

возможно дубликат [Сетевое обнаружение с помощью запросов вещания Snmp] (HTTP://stackoverflow.com/questions/25894554/network-discovery-using-broadcast-snmp-requests) – Jolta

ответ

0

Прямо сейчас у вас есть по крайней мере 25 адресов, которые не будут реагировать на SNMP , С тайм-аутом 2 секунды и 4 повторения, что означает 250 секунд ожидания ответов. Если вы проверите их все параллельно, вам (теоретически) придется ждать 10 секунд. Вы можете сделать это путем создания потоков самостоятельно, но проще использовать встроенный в параллельных циклов:

 List<IPAddress> addresses = new List<IPAddress>() 
             { 
              IPAddress.Parse("192.168.1.1"), 
              IPAddress.Parse("192.168.1.5"), 
              IPAddress.Parse("192.168.1.10"), 
              IPAddress.Parse("192.168.1.11"), 
             }; 
     Parallel.ForEach(addresses, ip => 
     { 
      CheckPrinter(ip); 
     }); 

или

 Parallel.For(1, 255, i => 
     { 
      CheckPrinter("192.168.1." + i); 
     });