Récupération de temps de réponse (PING) en C

Récupération de temps de réponse (PING) en C - C - Programmation

Marsh Posté le 31-10-2008 à 18:54:11    

Bonsoir,
 
Je cherche à faire un programme récupérant des temps de réponse . Je m'explique :
manuellement je pourrait faire ping 192.168.1.1 et observer le tps de réponse. Là, je veux que mon programme  
récupère ce temps de réponse pour l'enregistrer dans une variable. Le problème s'est qu'un system("ping ..." )
me renverra seulement 1 ou 0 selon que le ping est fonctionné.
Comment puis-je faire autrement ?
(Mon niveau n'est pas très élevé alors merci d'expliciter si vous pouvez)
 
Jo

Reply

Marsh Posté le 31-10-2008 à 18:54:11   

Reply

Marsh Posté le 31-10-2008 à 20:35:58    

La solution sale, c'est d'exécuter la commande externe "ping" comme tu le propose. popen() permet de faire ça et de lire la sortie standard de la commande, ou tu peux récupérer le temps (enfin, si tu es sous un unixoïde, je ne sais pas si popen sous windows).
 
La solution propre, c'est de faire le ping programatiquement, soit à la main en envoyant des packets ICMP comme un grand, soit en utilisant une lib qui sait faire ça (ne me demande pas, je n'en connais pas).

Reply

Marsh Posté le 31-10-2008 à 20:42:49    

popen sur ping ca passe encore, c'ets pas si sale. Du moins moins que system :E

Reply

Marsh Posté le 31-10-2008 à 21:35:58    

Malheureusement je suis sous Windows XP. Je veux bien le faire manuellement, mais comment envoyer ses packet etc... Connaissez vous un tuto bien fait ou un exemple ??
 
Merci

Reply

Marsh Posté le 31-10-2008 à 22:05:10    

bah sinon, boost::asio et les protocoles associés


Message édité par Joel F le 31-10-2008 à 22:05:16
Reply

Marsh Posté le 01-11-2008 à 07:43:24    

C'est pas du C :)
 
 
Voici un lien sur le paquet contenant les sources de la commande ping : http://www.skbuff.net/iputils/iputils-current.tar.bz2
 
C'est la version linux, mais tu peux facilement adapter ça sous windows.
 
Le principe est assez simple, en gros tu crées une socket avec le protocole ICMP (celui qui permet de faire des requêtes ping), tu te connectes sur la socket, tu envoies une trame ECHO, tu attends la réponse, et tu mesures le temps entre l'envoi et la réception. Tu peux en envoyer plusieurs pour faire une moyenne, car 1 seule trame peut effectuer une mesure incohérente.
 
Format d'une trame ICMP : http://fr.wikipedia.org/wiki/ICMP  (ça devrait te suffire), ou bien carrément la RFC  : http://abcdrfc.free.fr/rfc-vf/rfc792.html  
 

Reply

Marsh Posté le 01-11-2008 à 11:30:33    

faut que j'apprene à regarder les sous-sections v_v

Reply

Marsh Posté le 01-11-2008 à 12:36:47    

ok je vais regarder merci

Reply

Marsh Posté le 01-11-2008 à 13:02:48    

Je viens de regarder les sources de "ping.c", le principe est en effet simple, mais le code est lui long et complex !!. Il n'existe aucun moyen plus "bourrin" mais plus simple, comme le popen, mais permettant de récupérer les valeurs retournées ? (mon code n'a pas besoin d'être portable ni très propre c'est un truc perso)
 
Merci

Reply

Marsh Posté le 01-11-2008 à 13:16:51    

tu peut recupérer les sorties avec popen :o
 
http://www.linux-kheops.com/doc/ma [...] pen.3.html

Reply

Marsh Posté le 01-11-2008 à 13:16:51   

Reply

Marsh Posté le 01-11-2008 à 15:55:27    

bon impec: après quelques manipulations pénible, je peux récupérer mes données. seul problème, c'est qu'à chaque ping il m'ouvre le shell ( et le "&" de linux ne marche pas sur windows)... Qq'un aurait-il une idée pour arranger ça ( en fait je fais de la SDL avec et l'aparition ce cet écran en plus de ma fenêtre principale est embêtante)
 
Merci


Message édité par d'jo le 01-11-2008 à 15:56:32
Reply

Marsh Posté le 06-11-2008 à 16:11:08    

up ?

Reply

Marsh Posté le 06-11-2008 à 17:27:38    

Ma solution ne te plait pas ? elle est pourtant simple et peut se faire en une vingtaine de lignes de code.
 
Sinon, si tu es sous windows, utilise la fonction CreateProcess. Elle a un tas de paramètres décrits dans la documentation MSDN (que l'on trouve en ligne), et l'un d'eux est une structure STARTUPINFO dans laquelle tu peux préciser les flux d'entrée et de sortie du processus fils. Ainsi, tu peux rediriger la sortie standard de ton processus fils vers un flux de ton application.

Reply

Marsh Posté le 07-11-2008 à 17:08:41    

20 lignes ... je n'ai pas du comprendre alors. Je vais regarder pour la fonction CreateProcess, mais comme j'ai précisé au début, je ne suis pas un programmeur chevronné et donc je n'ai pas du savoir identifier la vintaine de ligne utile pour moi dans la fonction ping.c du package.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed