IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

récupérer le status d'un ping


Sujet :

Réseau C

  1. #1
    Membre habitué
    Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2007
    Messages : 439
    Points : 178
    Points
    178
    Par défaut récupérer le status d'un ping
    Bonjour , j'aimerais récupérer le status d'un ping dans le cadre d'une classe outil réseaux.

    J'envoie un ping et je regarde si un pong arrive.
    Pour cela , je copie le flux dans un fichier que je lis après pour voir s'il contient perdus=1.

    Mais ca n'arrive pas à voir ça:

    En fait c'est du cpp mais c'est pratiquement uniquement des fonctions C.
    A par le > .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
         #include <stdio.h>
         #include <stdlib.h>
         #include <string.h>
     
         int ping (char ip[50]);
     
         int main (void)
         {
         int result;
         char ip[50];
     
     
     
         strcpy (ip,"192.168.0.99");
         result = ping (ip);
         printf ("0 pour offline, 1 pour online : %d",result);
         getchar();
         }
     
         int ping (char ip[50])
        {
         int result = 1;
         char commande[100];
         strcpy (commande,"ping ");
         strcat (commande,ip);
         strcat (commande, " -n 1: -w 200 > temp");
         system(commande);
         FILE * temp;
         temp = fopen ("temp","r");
         char test[50];
         while (!feof (temp))
         {
             fscanf (temp,"%s",test);
             // test correspond à la chaine perdus=1
             if (strcmp (test,"perdus=1") == 0   )
             {
                return 0;
             }
             printf("%s",test);
     
         }
         fclose(temp);
         return result;
         }
    merci pour votre aide.

  2. #2
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    J'ai bien une méthode pour ça, mais je sais pas si c'est de ton niveau ou pas

    En gros, tu construis toi même le paquet ICMP, tu l'envois, ensuite tu réceptionnes la réponse et tu vérifies le champ type du paquet.

    Un ptit coup de main : RFC 0792 (ICMP)

    Edit : correction (type et non pas code...)

  3. #3
    Membre habitué
    Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2007
    Messages : 439
    Points : 178
    Points
    178
    Par défaut
    ca demanderait d'utiliser des structures de bibliothèques?
    J'ai appris la théorie du protocole IP rapidement en cours d'informatique mais nous l'avons pas codé.

    Tu peux toujours me la donner


    Sinon par rapport à ma question , où est le problème?

  4. #4
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    C'est ça qui me gène :
    Voilà un moyen, peut être un peu barbare, d'executer une commande ping sur un reseau local et d'en recevoir le resultat ...
    Pour la méthode que je t'ai décrite, il y a 2 entêtes qui définissent les entêtes IP et ICMP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <netinet/ip.h>
    #include <netinet/icmp.h>
    Hélas ceux-ci sont apparament disponibles uniquement sous UNIX/Linux. Si tu veux les utiliser sous Windows, il faudra définir toi même ces structures (suffit de les copier - éventuellement les adapter).

    Good luck

  5. #5
    Membre habitué
    Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2007
    Messages : 439
    Points : 178
    Points
    178
    Par défaut
    en analysant mon flux (en faisant un prinft) , j'ai pu voir que les chaines étaient envoyés un peu n'importe comment..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     // test correspond à la chaine perdus=1
             if (strcmp (test,"100%),") == 0   )
             {
                return 0;
             }
             printf("%s|||",test);
    J'ai donc changé mon test mais je pense pas que ca marche pour tous les cas ...

  6. #6
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    hélas j'ai testé et je crois que c'est du type "perdus = 1" et avec les espaces tu ne l'auras pas avec un seuls fscanf.

    Pour le C++ utilise <cstdio> plutot que <stdio.h>, aussi <cstdlib> au lieu de <stdlib.h>

  7. #7
    Membre habitué
    Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2007
    Messages : 439
    Points : 178
    Points
    178
    Par défaut
    Citation Envoyé par coyotte507
    Pour le C++ utilise <cstdio> plutot que <stdio.h>, aussi <cstdlib> au lieu de <stdlib.h>

    quelle est la différence?

  8. #8
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    je ne sais pas pour la différence, ils contiennent les mêmes fonctions mais spécialement faites pour le C++ donc la différence doit être dans les performances.

    Le voila en beau c++

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    #include <iostream>
    #include <fstream>
    #include <string.h>
     
    using namespace std;
     
    int ping (string ip);
     
    //le "endl" veut dire "entrée" ou retour à la ligne
    int main (void)
    {
            int result;
            string ip = "192.168.0.99";
     
            result = ping (ip);
            cout << "0 pour offline, 1 pour online : " << endl << result << endl;
            getchar();
            return 0;
    }
     
    int ping (string ip)
    {
         int result = 1;
     
         string commande = "ping " + ip + " -n 1: -w 200 > temp";
         system(commande.c_str());
     
         ifstream temp("temp");
     
         string test;
     
         while (!temp.eof())
         {
             temp >> test;
             cout << test << " ";
             if (test == "perdus")
             {
                 //on vérifie si = à 1
                 temp >> test; // le '='
                 temp >> test; // le chiffre
                 if (test == "1")
                 {
                     //1 paquet perdu
                     result = 0;
                 }
                 cout << "= " << test;
             }
         }
         temp.close();
         cout << endl;
     
         return result;
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. $.ajax() récupérer le status code
    Par WalidNat dans le forum jQuery
    Réponses: 1
    Dernier message: 15/01/2012, 20h18
  2. Comment récupérer le status
    Par ocari dans le forum C
    Réponses: 1
    Dernier message: 12/04/2011, 15h52
  3. [C#] Récupérer l'etat d'un ping
    Par Cheeper dans le forum C#
    Réponses: 5
    Dernier message: 13/08/2009, 11h51
  4. Récupérer le status d'une requete SQL avec ADODB
    Par undercrash dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 14/08/2008, 14h13
  5. Récupérer le status d'une url
    Par homerosaur dans le forum Langage
    Réponses: 4
    Dernier message: 18/10/2006, 18h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo