Coder une commande Unix en C

Fermé
Trèfle - 1 avril 2006 à 20:04
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 18 avril 2006 à 18:38
Bonjour,

je dois coder la commande
traceroute
disponible sous unix en utilisant le langage C mais je ne sais pas vraiment comment m'y prendre avec tous les cours qui ont sauté ...

Si quelqu'un pouvait m'aider ?

Merci
A voir également:

13 réponses

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
10 avril 2006 à 22:05
C'est clair que c'est un sujet assez long, et je parle en connaissance de cause puisque le début de ma thèse a porté sur ces problématiques.

Hélas c'est une piste que j'ai laissé de côté pour les raisons que je t'ai déjà cité, donc à part te donner les grandes lignes je ne vais pas pouvoir faire beaucoup plus.

1) Programmer un traceroute. Puisque tu as des cours de retard, je te conseille de repartir d'une implémentation de traceroute dispo sur traceroute.org, ça te gagnera pas mal de temps.

2) Travail sur le graphe. Le mieux c'est d'utiliser boost donc c'est vraiment dommage de le faire en C... car tu vas devoir réimplémenter une classe de graphe, alors que ce sont des trucs qui existent déjà dans la BGL !

3) Le reste du travail est assez simple une fois que tu auras traité ces deux points, ça devrait aller vite.

Bonne chance
1
ou est-ce un sujet "académique" que tu dois faire à partir de rien.

Je suis dans ce cas de figure

Pour l'implémentation sur la partie graphe, tu peux utiliser du C++ avec la lib boost (plus précismment la BGL), un peu chaude à manipuler au début mais ultra bien faite et hyper rapide.

Je dois le faire en langage C .

En lisant ton post,je commence à me dire que c'est irréalisable à mon niveau.
En effet,je débute à peine la programmation système .
A ceci s'ajoute également des heures de cours et de TD qui n'ont pas été donnés.
0
(suite)C'est pourquoi j'aimerais avoir plus de précision.

Merci par avance
0
Il y a un truc que je ne comprends pas.

Les adresses ip doivent être écrits dans un fichier ?
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
14 avril 2006 à 19:10
A priori tu spécifies une liste d'adresse ip destination que tu tentes de joindre par traceroute. Idéalement une ip qui répond ;-)
0

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

Posez votre question
Il faut donc que je lance un traceroute avec la commande shell comme celle-ci par exemple :
Détermination de l'itinéraire vers www.commentcamarche.net [163.5.255.85]
avec un maximum de 30 sauts :

  1    33 ms    32 ms    33 ms  raspail-2-81-57-234-254.fbx.proxad.net [81.57.234.254]
  2    33 ms    33 ms    33 ms  vlq-6k-2-a5.routers.proxad.net [213.228.4.254]
  3    33 ms    33 ms    33 ms  vlq-6k-2-v802.intf.routers.proxad.net [212.27.50.46]
  4    33 ms    33 ms    33 ms  th1-6k-2-v806.intf.routers.proxad.net [212.27.50.41]
  5    32 ms    34 ms    34 ms  cbv-6k-2-v802.intf.routers.proxad.net [212.27.50.34]
  6    34 ms    32 ms    33 ms  ldc-6k-1-a0.routers.proxad.net [213.228.15.67]
  7    35 ms    35 ms    35 ms  cogent.FreeIX.net [213.228.3.187]
  8    36 ms    36 ms    35 ms  NeufTelecom.demarc.cogentco.com [130.117.16.22]
  9    36 ms    36 ms    36 ms  V3994.c1cbv.gaoland.net [212.94.162.209]
 10    34 ms    34 ms    35 ms  V4080.core3.cbv.gaoland.net [212.94.161.129]
 11    36 ms    35 ms    37 ms  212.94.164.210
 12    36 ms    36 ms    36 ms  nestor.commentcamarche.org [163.5.255.85]
 
Itinéraire déterminé.


puis il faut que je recopie les adresses ip que je mettrais dans un fichier par exemple comme cela en reprenant les valeurs du traceroute précédent?
163.5.255.85
81.57.234.254
213.228.4.254
212.27.50.46
212.27.50.41
212.27.50.34
213.228.15.67
213.228.3.187
130.117.16.22
212.94.162.209
212.94.161.129
212.94.164.210
163.5.255.85 
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
18 avril 2006 à 18:38
Non ce que je dis c'est que pour tester le traceroute que tu vas implementer, il faut faire tes tests sur une ip qui répond (par exemple 163.5.255.85, ip de commentcamarche). Mais sinon le concept du traceroute c'est bien d'envoyer des paquet avec un TTL que tu fais augmenter progressivement.

Je t'invite vivement à regarder comment marche un traceroute sur google et t'inspirer d'une implémentation de traceroute que tu pourras récupérer sur traceroute.org.

Si tout se passe bien ton traceroute doit être capable de renvoyer les mêmes résultats que le traceroute que tu as utilisé ci-dessus.

Bonne chance
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
2 avril 2006 à 19:44
Salut qu'entend tu par coder?
Si un programme doit invoquer cette commande, rien de plus facile, tu met : "system("traceroute");" dans ton code C.
Si tu doit la recoder, la c'est une autre pair de manche, il faut faire apel à la programmation réseau. Là tu trouvera plein d'exemple en cherchant socket+unix sur un moteur de recherche.
Ensuite, traceroute utilise un protocole assez particulier il me semble, je croi que c'est snmp, ou arp (mais la c'est à vérifier)
-1
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
2 avril 2006 à 21:30
Le concept du traceroute, c'est d'envoyer un paquet UDP avec un TTL de 1. Le paquet meurt, et le premier routeur atteint renvoie un paquet ICMP annonçant que le paquet à atteint un TTL de 0 (paquet mort). On recupère ainsi l'ip du premier routeur. Puis on re commence avec un TTL de 2, puis de 3 et ainsi de suite jusqu'à atteindre la destination.

Remarque 1 : on ne connaît que le chemin d'interface aller.
Remarque 2 : le chemin aller est généralement différent du chemin retour (cf cours sur BGP) (et il n'y a pas de moyen de connaître ce chemin retour depuis ton PC)

Pour plus d'infos
http://www.piaf.asso.fr/article.php3?id_article=184
... et tous les sites que tu pourras trouver sur google.

Bonne chance
-1
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
10 avril 2006 à 09:02
Ah, justement je me demandais comment ça fonctionnait ce truc.
Mais s'il faut envoyer un paquet udp et attendre une réponse icmp.

Ca peut se faire au niveau des sockets? Par exemple en fonction du code d'erreur, on sait qu'on a reçu la réponse icmp?
0
Bonjour,

merci pour les réponses.

Est ce que vous pourriez m'indiquer les appels systemes à utiliser car mon prof de TD avait (avant le blocus) dit que l'on avait besoin de pipe,fork,... c'est à dire des appels simples or cela me paraît plus compliqué que cela.
Depuis 2 semaines c'est la néant pas de cours ni td...

Si quelqu'un pouvait me renseigner?

De plus,mon programme doit pouvoir :
-avoir plusieurs traceroute s'effectuant simultanément, afin de rassembler des informations le plus vite possible ;
-pouvoir choisir à la volée combien de traceroute on souhaite exécuter en parallèle) ;
-ajouter de nouvelles « cibles » pour traceroute pendant que l'ensemble fonctionne


Comme je n'ai eu aucun cours qui traite de cela ...
-1
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
3 avril 2006 à 21:54
Une fois que tu aura réussi à faire un traceroute vers 1 IP à la foi, le reste viendras, c'est juste une histoire de thread ou de fork.
grosso modo une foi que tu as une fonction traceroute qui fonctionne, tu fait ça :
lire IP à tracer
fork
-> processus fils :chercher route
-> processus père retourner à attendre IP
Sinon, je ne peux pas plus t'aider que ça. Mais il doit y avoir les source sur internet pour linux au moins.
-1
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
3 avril 2006 à 23:00
En effet avec google :
http://www.traceroute.org/#source%20code

Je t'invite à regarder aussi quelques cours sur google :
- de réseau : pour maitriser traceroute à fond
- de système : pour bien comprendre les fork et compagnie (et je confirme tu n'as besoin que des appels systèmes "simples")

Bonne chance
-1
Bonjour,

en faite,il ne faut pas coder le traceroute classique,les temps de réponse ne doivent pas être pris en compte,de même il faut utiliser seulement les adresses IP et pas les DNS.

Ce n'est pas tant le fait de programmer que je n'arrive pas mais c'est la manière dont il faut que je m'y prenne.
J'ai régardé plusieurs liens mais j'ai du mal.

Je vous met l'énoncé ce qui vous permettra peut-être de m'aiguiller.

En vous remerciant par avance



Il s'agit d'écrire un programme (ou un ensemble de programmes) permettant d'effectuer des traceroute automatiquement, en tâche de fond ; et pendant que se font ces traceroute, de rassembler des informations sur le graphe d'Internet. En particulier, pour chaque noeud du graphe (on assimilera un noeud à son adresse IP), on souhaite pouvoir connaître ses voisins, ainsi que sa distance minimale à l' « origine » (la distance n'est pas forcément constante, par exemple entre le noeud A et le noeud B, le noeud X peut apparaître en 5è position ; et le même noeud X peut apparaître en 8è position entre le noeud A et le noeud C -- c'est surprenant, mais c'est possible!).

Il est indispensable de pouvoir :

    * avoir plusieurs traceroute s'effectuant simultanément, afin de rassembler des informations le plus vite possible ;
    * pouvoir choisir à la volée combien de traceroute on souhaite exécuter en parallèle) ;
    * ajouter de nouvelles « cibles » pour traceroute pendant que l'ensemble fonctionne ;
    * ajouter des cibles « aléatoires » (en tirant des adresses IP au hasard) ;
    * visualiser des statistiques indiquant le nombre d'adresses IP « explorées » (nombre total, et classement par distance par rapport à l'origine) ;
    * indiquer les « voisins » d'un noeud donné par son adresse IP ;
    * exporter (et importer) l'état du graphe, sous forme de deux fichiers CSV : un contenant la liste des sommets (adresses IP) avec leur distance minimale à la source, et un autre contenant une liste de couples d'adresses IP ;
    * fournir un rapport expliquant les structures algorithmiques utilisées, avec une indication de leurs limites (mémoire, CPU, occupation disque...) -- c'est-à-dire une étude de la complexité des algorithmes utilisés ;
    * présenter un code propre et lisible, autant que faire ce peu.


Informations techniques

Une adresse IP = 4 octets. Généralement on la représente sous la forme 134.157.0.129 (sous forme de 4 nombres entiers, en décimal, séparés par des points).
Les plages d'adresses suivantes sont « privées », c'est-à-dire internes :

    * 10.0.0.0 à 10.255.255.255
    * 172.16.0.0 à 172.31.255.255
    * 192.168.0.0 à 192.168.255.255

La plage 224.0.0.0 à 239.255.255.255 est réservée au multicast.
Les adresses de 240.0.0.0 à 255.255.255.255 sont réservées.
Toutes ces plages (adresses privées, multicast, réservées) doivent être traitées de manière spéciale ; il est parfaitement acceptable de ne pas les stocker dans le graphe (de les considérer comme les « * » qui apparaissent parfois dans traceroute).

Le format CSV à utiliser, pour la liste des noeuds : adresse IP, distance
1.2.3.4,17
134.157.0.129,8
193.55.63.92,2
Le format CSV à utiliser, pour la liste des arêtes : adresse IP1, adresse IP2
1.2.3.4,1.2.3.5
134.157.0.129,134.157.254.1
193.55.63.1,193.55.63.29
On utilisera \n comme séparateur de lignes.
-1
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
10 avril 2006 à 00:16
Tu devrais regarder la thèse de Neil Spring alors, où le "cheminement" que tu recherches est expliqué :
http://www.cs.umd.edu/~nspring/papers/nspring-thesis.pdf

Sa thèse porte justement sur des méthodes à base de sondes actives (notamment traceroute) afin de sonder l'internet. Cf table des matières pour trouver le passage qui t'intéresse.

Mais bon c'est un peu bizarre comme sujet car :

1) la graphe de l'internet est immense, 20000 domaines (les AS) regroupant chacun des centaines de routeurs munix eux même de plusieurs interfaces !
2) les traceroutes sont souvent filtrés
3) pour faire des traceroute on utilise plutôt des looking glass (cf traceroute.org), permettant de sonder l'Internet depuis différents endroits (cf http://www.traceroute.org/ tu peux lancer des traceroute depuis à pu près ou tu veux).

La vraie question est donc veux tu reconstituer le graphe de l'Internet à la granularité interface (ce qui est un peu irréaliste à mon avis) auquel cas autant interroger treceroute.org avec un script, ou est-ce un sujet "académique" que tu dois faire à partir de rien.

Pour l'implémentation sur la partie graphe, tu peux utiliser du C++ avec la lib boost (plus précismment la BGL), un peu chaude à manipuler au début mais ultra bien faite et hyper rapide.

Par ailleurs ton sujet dit :

(la distance n'est pas forcément constante, par exemple entre le noeud A et le noeud B, le noeud X peut apparaître en 5è position ; et le même noeud X peut apparaître en 8è position entre le noeud A et le noeud C -- c'est surprenant, mais c'est possible!).

... mais en fait ça n'a rien de surprenant car celà découle directement des politiques de routage des AS. Soit dit en passant le chemin de A à X est dans le cas général du chemin de X à A. Cf protocole BGP pour plus de détails ;-)

Bonne chance
-1