Ошибка SNMP "System.IndexOutOfRangeException"

Пытаясь понять и изучить, что такое snmp, читая и выполняя примеры из книги по программированию в Newtork. У меня ошибка (в строке MIB Structure) при выполнении программы (на стр. 435). Я только что вставил класс SNMP (стр. 430) в проект.

Проблема в:

Произошло необработанное исключение типа "System.IndexOutOfRangeException" в SimpleSNMP.exe

Строка кода

response = conn.get("get", argv[0], argv[1], "1.3.6.1.2.1.1.5.0");

Я хочу узнать состояние удаленных устройств с помощью snmp. Любой полезный, полезный и работающий пример C# SNMP приветствуется.

Весь код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace SimpleSNMP
{
    class Program
    {
        static void Main(string[] argv)
        {
            int commlength, miblength, datatype, datalength, datastart;
            int uptime = 0;
            string output;
            SNMP conn = new SNMP();
            byte[] response = new byte[1024];
            Console.WriteLine("Device SNMP information:");
            // Send sysName SNMP request and get the response
            response = conn.get("get", argv[0], argv[1], "1.3.6.1.2.1.1.5.0");
            if (response[0] == 0xff)
            {
                Console.WriteLine("No response from {0}", argv[0]);
                return;
            }
            // Get the community name and MIB lengths from the packet
            commlength = Convert.ToInt16(response[6]);
            miblength = Convert.ToInt16(response[23 + commlength]);
            // Extract the MIB data from the SNMP response
            datatype = Convert.ToInt16(response[24 + commlength + miblength]);
            datalength = Convert.ToInt16(response[25 + commlength + miblength]);
            datastart = 26 + commlength + miblength;
            output = Encoding.ASCII.GetString(response, datastart, datalength);
            Console.WriteLine(" sysName - Datatype: {0}, Value: {1}",
            datatype, output);
            // Send a sysLocation SNMP request
            response = conn.get("get", argv[0], argv[1], "1.3.6.1.2.1.1.6.0");
            if (response[0] == 0xff)
            {
                Console.WriteLine("No response from {0}", argv[0]);
                return;
            }
            // Get the community name and MIB lengths from the response
            commlength = Convert.ToInt16(response[6]);
            miblength = Convert.ToInt16(response[23 + commlength]);
            // Extract the MIB data from the SNMP response
            datatype = Convert.ToInt16(response[24 + commlength + miblength]);
            datalength = Convert.ToInt16(response[25 + commlength + miblength]);
            datastart = 26 + commlength + miblength;
            output = Encoding.ASCII.GetString(response, datastart, datalength);
            Console.WriteLine(" sysLocation - Datatype: {0}, Value: {1}",
            datatype, output);
            // Send a sysContact SNMP request
            response = conn.get("get", argv[0], argv[1], "1.3.6.1.2.1.1.4.0");
            if (response[0] == 0xff)
            {
                Console.WriteLine("No response from {0}", argv[0]);
                return;
            }
            // Get the community and MIB lengths
            commlength = Convert.ToInt16(response[6]);
            miblength = Convert.ToInt16(response[23 + commlength]);
            // Extract the MIB data from the SNMP response
            datatype = Convert.ToInt16(response[24 + commlength + miblength]);
            datalength = Convert.ToInt16(response[25 + commlength + miblength]);
            datastart = 26 + commlength + miblength;
            output = Encoding.ASCII.GetString(response, datastart, datalength);
            Console.WriteLine(" sysContact - Datatype: {0}, Value: {1}",
            datatype, output);
            // Send a SysUptime SNMP request
            response = conn.get("get", argv[0], argv[1], "1.3.6.1.2.1.1.3.0");
            if (response[0] == 0xff)
            {
                Console.WriteLine("No response from {0}", argv[0]);
                return;
            }

        // Get the community and MIB lengths of the response
        commlength = Convert.ToInt16(response[6]);
        miblength = Convert.ToInt16(response[23 + commlength]);
        // Extract the MIB data from the SNMp response
        datatype = Convert.ToInt16(response[24 + commlength + miblength]);
        datalength = Convert.ToInt16(response[25 + commlength + miblength]);
        datastart = 26 + commlength + miblength;
        // The sysUptime value may by a multi-byte integer
        // Each byte read must be shifted to the higher byte order
        while(datalength > 0)
        {
        uptime = (uptime << 8) + response[datastart++];
        datalength++ ;
        }
            Console.WriteLine(" sysUptime - Datatype: {0}, Value: {1}",
        datatype, uptime);
        }
    }
}

0 ответов

Другие вопросы по тегам