Manipulation de Traps SNMP en C et Java

Programmation en C

Comme nous l'avons vu précédemment, pour récupérer les alertes SNMP, le manager doit écouter sur le port UDP 162. Nous allons donc créer un serveur udp écoutant sur ce port. Le message arrivant au manager est bien-sûr encodé en ASN.1-BER et devrait être décodé. Pour cela on peut utiliser un paquetage libre, snacc.



L'exemple suivant récupère la Trap SNMP mais ne décode pas le message.



/* SNMP Trap Listener
   Romain JOURDAN
   IR3
   This program listens on port 162 to get SNMP Trap
*/

#include 
#include 
#include 
#include 
#include 
#include 
#include  

#define SNMP_TRAP_PORT 162
#define MAX_MSG 100

int main(int argc, char *argv[]) {
  
  int sd, rc, n, cliLen;
  struct sockaddr_in cliAddr, servAddr;
  char msg[MAX_MSG];
  
  /* socket creation */
  sd=socket(AF_INET, SOCK_DGRAM, 0);
  if(sd<0) {
    printf("can't open socket \n");
    exit(1);
  }

  /* bind local server port */
  servAddr.sin_family = AF_INET;
  servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
  servAddr.sin_port = htons(SNMP_TRAP_PORT);
  rc = bind (sd, (struct sockaddr *) &servAddr,sizeof(servAddr));
  if(rc<0) {
    printf("can't bind port number %d \n", SNMP_TRAP_PORT);
    exit(1);
  }

  printf("waiting for SNMP Traps on UDP port %d\n", SNMP_TRAP_PORT);

  /* server infinite loop */
  while(1) {
    
    /* init buffer */
    memset(msg,0x0,MAX_MSG);


    /* receive message */
    cliLen = sizeof(cliAddr);
    n = recvfrom(sd, msg, MAX_MSG, 0, (struct sockaddr *) &cliAddr, &cliLen);

    if(n<0) {
      printf("%s: cannot receive data \n",argv[0]);
      continue;
    }
    /*message is encoded with ASN1 and should be decoded*/  
    /* print received message */
    printf("SNMP Trap received from %s : %o\n", inet_ntoa(cliAddr.sin_addr),msg);
    
    
  }/* end of server infinite loop */

return 0;

}