Requete SNMP

cs_SEB73460 Messages postés 271 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 29 novembre 2022 - Modifié par jordane45 le 8/01/2015 à 17:59
cs_SEB73460 Messages postés 271 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 29 novembre 2022 - 11 janv. 2015 à 09:03
Bonjour,

lors de l envoi d une requête SNMP :
 public 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("Test SNMP");


        // Envoi requete SNMP

        response = conn.get("get", argv[0], argv[1], "1.3.6.1.4.1.36413.1.2.3.2.1");
        if (response[0] == 0xff)
        {
            Console.WriteLine("No response from {0}", argv[0]);
            return;
        }

        // Si réponse OK, get the community name and MIB lengths

        commlength = Convert.ToInt16(response[6]);
        miblength = Convert.ToInt16(response[23 + commlength]);


--j ai l erreur suivante :

"L'index se trouve en dehors des limites du tableau"

je débute avec SNMP et C#, je ne vois pas d ou peu venir cette erreur !

Merci a tous pour votre aide
Sébastien


EDIT : Ajout des balises de code

8 réponses

Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
Modifié par Whismeril le 8/01/2015 à 19:44
Bonsoir, à quelle ligne se situe l'erreur?
Quel est le contenu des variables?

Dis merci à Jordane d'avoir rendu ta question bien plus lisible.

La modération m'amène à intervenir dans de nombreux posts, mais le seul langage que je maitrise est le C#, un peu de VB aussi. Pour vos codes pensez à la coloration. Réponse trouvée ->Question Résolue
0
cs_SEB73460 Messages postés 271 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 29 novembre 2022
8 janv. 2015 à 19:07
Bonsoir,
ligne 14

--
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
8 janv. 2015 à 19:44
Et le contenu des variables?
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 344
8 janv. 2015 à 19:59
Si le message d'erreur concerne la ligne 14 et qu'il t'indique que l' index est en dehors des limites du tableau...c'est surement que le souci se situe sur ta variable
argv[0] et/ou argv[1]

Comme te l'a demande Whismeril.. peux tu nous dire.. au moment du plantage.. ce que contiennent ces deux variables ??
Ajoutes quelques writeline..(à la ligne 13...)

 try {
    Console.WriteLine(" argv[0] => ", argv[0]);
    Console.WriteLine(" argv[1] => ", argv[1]);
    response = conn.get("get", argv[0], argv[1], "1.3.6.1.4.1.36413.1.2.3.2.1");
 } catch (System.IO.IOException e) {
    Console.WriteLine("Error conn.get : Message = {0}",  e.Message);
 }



Comment appelles tu ta fonction Main(string[] argv) ?
Quels arguments lui passes tu ?


PS :
Merci de bien vouloir utiliser la coloration syntaxique (les balises de code) lorsque tu postes du code sur le forum.
Explications disponibles ici :
http://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code




Dis merci à Jordane d'avoir rendu ta question bien plus lisible.

De rien ;-)


0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
8 janv. 2015 à 20:05
Comme te l'a demande Whismeril.. peux tu nous dire.. au moment du plantage.. ce que contiennent ces deux variables ??
Ajoutes quelques writeline..(à la ligne 13...)


Ou simplement quand ça plante, Visual Studio se mets en pause.
Tu peux alors survoler les variables avec la sourie et voir le contenu dans l'info bulle.

Comme Jordane, je suis à peu près sûr que ton tableau est vide ou contient une seule entrée, mais....
0
cs_SEB73460 Messages postés 271 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 29 novembre 2022
Modifié par jordane45 le 9/01/2015 à 11:35
Bonjour,

Mon code :
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;


public class SimpleSNMP
{
   public 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];


       try {

      Console.WriteLine("Test SNMP:");

      //Console.WriteLine(" argv[0] => ", argv[0]);
      //Console.WriteLine(" argv[1] => ", argv[1]);

      // Envoi requete SNMP

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

       }
       catch (System.IO.IOException e)
       {
           Console.WriteLine("Error conn.get : Message = {0}", e.Message);
       }




      if (response[0] == 0xff)
      {
         Console.WriteLine("Pas de réponse de {0}", argv[0]);

         return;
      }


      // If response, get the community name 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("  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("Pas de réponse de {0}", argv[0]);

         return;
      }


      // If response, get the community name 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("  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("Pas de réponse de {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("Pas de réponse de {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);

   }
}


class SNMP
{
   public SNMP()
   {

   }

   public byte[] get(string request, string host, string community, string mibstring)
   {
      byte[] packet = new byte[1024];
      byte[] mib = new byte[1024];
      int snmplen;
      int comlen = community.Length;
      string[] mibvals = mibstring.Split('.');
      int miblen = mibvals.Length;
      int cnt = 0, temp, i;
      int orgmiblen = miblen;
      int pos = 0;


      // Convert the string MIB into a byte array of integer values
      // Unfortunately, values over 128 require multiple bytes
      // which also increases the MIB length

      for (i = 0; i < orgmiblen; i++)
      {
         temp = Convert.ToInt16(mibvals[i]);
         if (temp > 127)
         {
            mib[cnt] = Convert.ToByte(128 + (temp / 128));
            mib[cnt + 1] = Convert.ToByte(temp - ((temp / 128) * 128));

            cnt += 2;
            miblen++;

         }

         else

         {
            mib[cnt] = Convert.ToByte(temp);
            cnt++;
         }
      }
      snmplen = 29 + comlen + miblen - 1;  //Length of entire SNMP packet


      //The SNMP sequence start

      packet[pos++] = 0x30; //Sequence start
      packet[pos++] = Convert.ToByte(snmplen - 2);  //sequence size


      //SNMP version

      packet[pos++] = 0x02; //Integer type
      packet[pos++] = 0x01; //length
      packet[pos++] = 0x00; //SNMP version 1


      //Community name

      packet[pos++] = 0x04; // String type
      packet[pos++] = Convert.ToByte(comlen); //length


      //Convert community name to byte array

      byte[] data = Encoding.ASCII.GetBytes(community);
      for (i = 0; i < data.Length; i++)
      {
         packet[pos++] = data[i];
      }


      //Add GetRequest or GetNextRequest value

      if (request == "get")
         packet[pos++] = 0xA0;

      else

         packet[pos++] = 0xA1;


      packet[pos++] = Convert.ToByte(20 + miblen - 1); //Size of total MIB


      //Request ID

      packet[pos++] = 0x02; //Integer type
      packet[pos++] = 0x04; //length
      packet[pos++] = 0x00; //SNMP request ID
      packet[pos++] = 0x00;
      packet[pos++] = 0x00;
      packet[pos++] = 0x01;


      //Error status

      packet[pos++] = 0x02; //Integer type
      packet[pos++] = 0x01; //length
      packet[pos++] = 0x00; //SNMP error status


      //Error index

      packet[pos++] = 0x02; //Integer type
      packet[pos++] = 0x01; //length
      packet[pos++] = 0x00; //SNMP error index


      //Start of variable bindings

      packet[pos++] = 0x30; //Start of variable bindings sequence

      packet[pos++] = Convert.ToByte(6 + miblen - 1); // Size of variable binding

      packet[pos++] = 0x30; //Start of first variable bindings sequence
      packet[pos++] = Convert.ToByte(6 + miblen - 1 - 2); // size
      packet[pos++] = 0x06; //Object type
      packet[pos++] = Convert.ToByte(miblen - 1); //length


      //Start of MIB

      packet[pos++] = 0x2b;


      //Place MIB array in packet

      for(i = 2; i < miblen; i++)

         packet[pos++] = Convert.ToByte(mib[i]);

      packet[pos++] = 0x05; //Null object value
      packet[pos++] = 0x00; //Null


      //Send packet to destination

      Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
                       ProtocolType.Udp);

      sock.SetSocketOption(SocketOptionLevel.Socket,
                      SocketOptionName.ReceiveTimeout, 5000);

      IPHostEntry ihe = Dns.Resolve(host);
      IPEndPoint iep = new IPEndPoint(ihe.AddressList[0], 161);
      EndPoint ep = (EndPoint)iep;
      sock.SendTo(packet, snmplen, SocketFlags.None, iep);


      //Receive response from packet

      try
      {
         int recv = sock.ReceiveFrom(packet, ref ep);

      } catch (SocketException)

      {
         packet[0] = 0xff;
      }

      return packet;
   }


   public string getnextMIB(byte[] mibin)
   {
      string output = "1.3";
      int commlength = mibin[6];
      int mibstart = 6 + commlength + 17; //find the start of the mib section

      //The MIB length is the length defined in the SNMP packet
     // minus 1 to remove the ending .0, which is not used

      int miblength = mibin[mibstart] - 1;
      mibstart += 2; //skip over the length and 0x2b values
      int mibvalue;

      for(int i = mibstart; i < mibstart + miblength; i++)
      {
         mibvalue = Convert.ToInt16(mibin[i]);

         if (mibvalue > 128)
         {
            mibvalue = (mibvalue/128)*128 + Convert.ToInt16(mibin[i+1]);

            //ERROR here, it should be mibvalue = (mibvalue-128)*128 + Convert.ToInt16(mibin[i+1]);
            //for mib values greater than 128, the math is not adding up correctly   
            
            i++;

         }

         output += "." + mibvalue;
      }


      return output;
   }

}


EDIT : AJOUT DES BALISES DE CODE
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 344
9 janv. 2015 à 11:34
Et ou sont les balises de code ?? ( la coloration syntaxique...)

Je t'invite à lire avec attention ceci :
Merci de bien vouloir utiliser la coloration syntaxique (les balises de code) lorsque tu postes du code sur le forum.
Explications disponibles ici :
http://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code

J'édite ton message pour les mettre ...la prochaine fois.. merci à toi d'y pense !
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 344
9 janv. 2015 à 11:38
Bon... tu nous a redonné le code de ta class... ok ...
Mais QUEL CODE UTILISES TU pour y faire APPEL ?

As tu testé le code que je t'avais donné ?
Qu'a t'il donné ?
Que t'ont affiché les CONSOLE.WRITELINE que j'y avais ajouté ?
Quelles sont les valeurs de tes variables ?

Peux-tu.. si tu veux de l'aide de notre part ... faire un minimum d'efforts pour répondre à nos questions ??
0
cs_SEB73460 Messages postés 271 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 29 novembre 2022
Modifié par cs_SEB73460 le 11/01/2015 à 09:06
Bonjour à tous,
j ai bien testé le code recu et c est pareil :
"L'index se trouve en dehors des limites du tableau"
le contenu de mes variables est vide,



je débute en snmp et je ne sais comment résoudre ce problème:
Merci à tous pour votre aide.

Sébastien
0
Rejoignez-nous