[C]Parsing d'un fichier

Résolu
Primitif -  
 abf -
Bonjour,

j'aurais besoin d'aide pour parser un fichier contenant les résultats d'un traceroute avec l'option -n.
Par exemple, je lance ce traceroute :

~ traceroute -n 192.48.96.9

traceroute to 192.48.96.9 (192.48.96.9), 30 hops max, 40 byte packets
 1  192.168.0.1  9.754 ms  9.461 ms  8.046 ms
 2  195.6.244.14  60.885 ms  48.924 ms  90.517 ms
 3  194.206.126.244  50.503 ms  48.97 ms  120.122 ms
 4  194.206.126.2  55.655 ms  52.213 ms  58.908 ms
 5  208.213.229.130  588.303 ms  589.843 ms  589.611 ms
 6  208.213.229.129  599.564 ms  599.763 ms  600.749 ms
 7  208.213.229.226  629.167 ms  599.284 ms  599.383 ms
 8  195.10.40.34  599.152 ms  599.289 ms  631.011 ms
 9  157.130.34.217  642.326 ms  715.072 ms  653.724 ms
10  146.188.160.62  595.143 ms  590.433 ms  659.247 ms
11  146.188.160.181  649.863 ms  700.901 ms  617.067 ms
12  137.39.253.86  600.835 ms  599.379 ms  590.867 ms
13  192.48.96.9  607.071 ms  589.221 ms  603.156 ms



Je voudrais savoir comment faire pour récupérer toutes les adresses IP et également comment faire pour ne pas prendre en compte les adresses IP non autorisées pour mon problème.

Les plages d'adresse IP non autorisées sont les suivantes :
10.0.0.0 à 10.255.255.255
172.16.0.0 à 172.31.255.255
192.168.0.0 à 192.168.255.255
224.0.0.0 à 239.255.255.255
240.0.0.0 à 255.255.255.255

Merci par avance

8 réponses

  1. Primitif
     
    Est-ce que quelqu'un pourrait m'aider, s'il vous plait?

    Merci
    0
  2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     
    Le mieux c'est de regarder ces deux fonctions : sous linux ou dans google tape :
    man fscanf
    man strtok

    L'idée est de prendre comme séparateur "ms" pour aller de temps en temps si tu utilises strtok. Mais je pense que ptu peux t'en sortir avec juste un fscanf.

    Attention au cas ou les temps n'apparaissent pas (contrôler le retour de fscanf), par exemple si l'hote est injoignable.

    Bonne chance
    0
  3. Primitif
     
    Bonjour,

    alors pour le parsing, j'ai fait ceci.
    A la sortie de la fonction, j'obtiens les mêmes lignes que le traceroute or, j'ai bien utilisé le fscanf pour ne prendre en compte que les adresses IP

    Est-ce que quelqu'un pourrait me dire d'ou vient le problème ?

    Merci

    #include <stdio.h>
    #include <stdlib.h>
    
    
    
    int main(void){
      FILE * file = fopen("fichier","r");
      char buffer[BUFSIZ];
      char buf1[BUFSIZ];
      char buf2[BUFSIZ];
      char buf3[BUFSIZ];
      char buf4[BUFSIZ];
    
      if(file == NULL){
        perror("erreur de lecture");
        exit(-1);
      }
      
      while(fgets(buffer, sizeof buffer, file) != NULL){
        fscanf(file, "%s.%s.%s.%s", buf1, buf2, buf3, buf4);
        printf("%s\n",buffer);
      }
      
      return 0;
    }
    
    0
  4. Primitif
     
    Bonjour,

    j'ai modifié mon code et j'obtiens un résultat plus convenable mais ce n'est pas encore très bien.

    Bonjour,

    j'ai fait le parsing de cette manière, ne connaissant pas regexp.

    Mon fichier pour le teste est le suivant :
     1  192.168.0.1  9.754 ms  9.461 ms  8.046 ms
     2  195.6.244.14  60.885 ms  48.924 ms  90.517 ms
     3  194.206.126.244  50.503 ms  48.97 ms  120.122 ms
     4  194.206.126.2  55.655 ms  52.213 ms  58.908 ms
     5  208.213.229.130  588.303 ms  589.843 ms  589.611 ms
     6  208.213.229.129  599.564 ms  599.763 ms  600.749 ms
     7  208.213.229.226  629.167 ms  599.284 ms  599.383 ms
     8  195.10.40.34  599.152 ms  599.289 ms  631.011 ms
     9  157.130.34.217  642.326 ms  715.072 ms  653.724 ms
    10  146.188.160.62  595.143 ms  590.433 ms  659.247 ms
    11  146.188.160.181  649.863 ms  700.901 ms  617.067 ms
    12  137.39.253.86  600.835 ms  599.379 ms  590.867 ms
    13  192.48.96.9  607.071 ms  589.221 ms  603.156 ms


    et en sortie, j'obtiens ceci :
    1
      195.6.244.14
      194.206.126.244
      194.206.126.2
      208.213.229.130
      208.213.229.129
      208.213.229.226
      195.10.40.34
      157.130.34.217
      146.188.160.62
      146.188.160.181
      137.39.253.86
      192.48.96.9


    Il y a un problème au niveau de la première ligne, pourquoi ?

    Voici mon code :
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    
    
    int main(void){
      FILE * file = fopen("fichier","r");
      char buffer[BUFSIZ];
      char buf1[BUFSIZ];
      char buf2[BUFSIZ];
      char buf3[BUFSIZ];
      char buf4[BUFSIZ];
      char * espace;
    
      if(file == NULL){
        perror("erreur de lecture");
        exit(-1);
      }
      
      while(fgets(buffer, sizeof buffer, file) != NULL){
        espace = strtok(buffer, " ");
        if(espace == NULL)
          {
    	perror("strtok");
    	exit(-1);
          }
        
        fscanf(file, "%s.%s.%s.%s", buf1, buf2, buf3, buf4);
        printf("%s\n",buffer);
      }
      
      return 0;
    }
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Primitif
     
    Bonjour,

    est-ce quelqu'un pourrait m'aider s'il vous plait ?

    Je voudrais également savoir comment il faut que je m'y prenne pour que ne pas prendre en compte les * * * qui apparaissent parfois dans les traceroute ainsi que ces plages d'adresses IP :
    10.0.0.0 à 10.255.255.255
    172.16.0.0 à 172.31.255.255
    192.168.0.0 à 192.168.255.255
    224.0.0.0 à 239.255.255.255
    240.0.0.0 à 255.255.255.255 


    Merci
    0
    1. cataclypse
       
      salut,

      une fois que tu as recupere les IP dans des cahins de type "a.b.c.d", tu peux utiliser la fonction strtok avec le point '.' comme delimiteur. De cette maniere, tu recuperes les 4 cahines "a", "b", "c", "d" que tu peux facilement convertir en entier avec atoi. Apres il te reste a tester que ces entiers correspondent a une adresse valide/autorisee.

      bon travail
      0
      1. Primitif > cataclypse
         
        Bonjour,

        c'est quoi des cahins ?
        0
  7. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     
    Ben c'est bizarre tu fais un fgets (donc lire une ligne dans le fichier), et ensuite au lieu de lire la ligne qui est extraite dans le buffer, tu relis une ligne avec des fscanf.

    Tu devrais utiliser un sscanf sur ton buffer, non ?

    Bonne chance
    0
  8. Primitif
     
    Bonjour,

    j'ai réecrit mon code mais au lieu d'afficher les adresses IP, je voudrais les stocker.

    Est-ce que quelqu'un pourrait m'indiquer comment faire s'il vous plait?

    Merci par avance

    Voici une partie du code, c'est la partie en gras qui permet la lecture et l'affichage de l'IP

     while (fgets(line, sizeof line, fp) != NULL)
    	{
    	  clean(line, fp);//cette fonction remplace '\n' par '\0'
    	  
    	  char *p = strtok(line, " ");
    	  if (p != NULL)
    	      {
    		p = strtok(NULL, " ");
    		if (p != NULL)
    		  {
    		    int ip[4];
    		    sscanf(p, "%d.%d.%d.%d", ip, ip + 1, ip + 2, ip + 3);
    		    printf ("%3d %3d %3d %3d\n", ip[0], ip[1], ip[2], ip[3]);
    		  }
    		else
    		  {
    		    printf ("format error\n");
    		    break;
    		 }
    	      }
    	  else
    	    {
    	      printf ("format error\n");
    	      break;
    	    }
    	}
    
    0
  9. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     
    Stocke les simplement dans une structure...
    struct ip_addr4{
     char ip[4];
    };
    
    void show_ip(struct ip_addr4 x){
      printf("%d.%d.%d.%d",x.ip[0],x.ip[1],x.ip[2],x.ip[3]);
    }
    
    int main(){
      ...
      struct ip_addr4 x;
      sscanf(p, "%d.%d.%d.%d",&(x.ip[0]), &(x.ip[1]),&(x.ip[2]),&(x.ip[3]));
      show_ip(x);
      ...
    }

    Bonne chance
    0
    1. abf
       
      merci beaucoup
      0