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

Développement Discussion :

Ping sous protocole TCP (et non UDP)


Sujet :

Développement

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2002
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 10
    Points : 10
    Points
    10
    Par défaut Ping sous protocole TCP (et non UDP)
    Bonjour,

    J’ai besoin de votre aide. Je travaille sous C++ Builder 6. Je dois envoyer un message ICMP de Type Echo Request puis récupérer le message ICMP de type Echo Reply associé. Et ceci sous le protocole TCP (et non UDP, en UDP je l’ai déjà fait et ça marche) Bref je dois réaliser un Ping sous TCP sans utiliser ce qui existe déjà.
    Je suis totalement débutante en ce qui concerne la programmation réseau (socket …)

    Voilà mon code et cela ne marche pas. Mon programme marche partiellement, c'est-à-dire que l’initialisation de winsock2, la création du socket, la connexion au serveur, la construction de la trame ICMP de type Echo Request et l’envoi du message fonctionnent. Après, ça bloque ou ça fait n’importe quoi (si je comment la boucle "do {}while( );") Cela fait des jours que je suis dessus mais je n’avance pas.

    Merci d’avance
    Isabelle

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    #define IP_SIZE 20 
    #define ICMP_SIZE 16    
    #define MAX_PACKET 100 
    
    int main(int argc, char * argv[]) 
    { 
    
        WSADATA WSAData; 
        //Initialisation de Winsock2 
        if(WSAStartup(MAKEWORD(2,2), & WSAData)!=0) 
          {perror("WSAStartup"); exit(1);} 
    
        char packet_buf[100]; 
        struct sockaddr_in their_addr; // Adresse de celui qui se connecte 
        int sock_fd; 
        //création socket 
        if ((sock_fd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) 
          {perror("socket"); exit(1);} 
    
        their_addr.sin_family = AF_INET;  
        their_addr.sin_port = htons(80);    
        their_addr.sin_addr.s_addr=inet_addr("217.12.3.11"); 
    
        //connexion au serveur 
        if (connect(sock_fd, (struct sockaddr *)&their_addr,sizeof(struct sockaddr_in)) == -1) 
          {perror("connect"); exit(1);} 
    
        struct icmphdr *icmp_buf=(struct icmphdr *) packet_buf; 
        //fonction qui construit la trame ICMP de type Echo Request 
        icmp_buf=BuildTrame(icmp_buf);  
    
        //envoie d'une requête (ici, message ICMP de type Echo Request) 
        if (send(sock_fd, (char *)icmp_buf, 16, 0) == -1) 
          {perror("send"); exit(1);} 
    
        struct icmphdr * icmp = (struct icmphdr *) malloc(ICMP_SIZE);   //allocation mémoire 
        /* Réception de la réponse ICMP avec l'entête IP */ 
        do 
        { 
    
          fd_set readfds; 
          FD_ZERO(&readfds); 
          timeval tv; 
          tv.tv_sec=5; 
          tv.tv_usec=0; 
    
          FD_SET(sock_fd, &readfds); 
          if&#40;select&#40;sock_fd+1,&readfds,NULL,NULL,&tv&#41;<0&#41; 
            &#123;perror&#40;"select"&#41;; exit&#40;1&#41;;&#125; 
    
          if&#40;recv&#40;sock_fd, packet_buf, IP_SIZE+ICMP_SIZE, 0&#41;<0&#41; 
            &#123;perror&#40;"recv"&#41;; exit&#40;1&#41;;&#125; 
          else &#123; 
            // Récupération de la partie ICMP du packet 
            memcpy&#40;icmp, &packet_buf&#91;IP_SIZE&#93;, ICMP_SIZE&#41;; 
          &#125; 
        &#125;while&#40;icmp->type!=0&#41;;      //ICMP_ECHO REPLY 
    
        struct time tps; 
        gettime&#40;&#40;struct time *&#41;&tps&#41;; 
        //Affiche l’heure au moment de la réception du message et l’heure 
        //contenue dans le message réceptionné et calcul leur différence. 
        double diff=diff_time&#40;&tps,&#40;struct time *&#41;icmp->data&#41;; 
    
        cout<<""Délais &#58; "<<diff<<" sec.    "<<endl<<endl; 
    &#125;//main

  2. #2
    zul
    zul est déconnecté
    Membre éclairé Avatar de zul
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 498
    Points : 699
    Points
    699
    Par défaut
    Je crains de ne pas comprendre. Le ping, comme tu l'a dis utilise un packet imcp.Donc si on considère un packet envoyé par le logiciel de ping, il sera du type =.
    [debut]
    HEADER IP
    HEADER IMCP
    [fin]

    Je ne vois donc comment tu peux envoyer un packet imcp en passant soit par udp, soit par tcp ??? Actuelllement tu construit un packet de la sorte
    [debut]
    HEADER IP
    HEADER TCP
    HEADER IMCP
    [fin]

    Le serveur va donc renvoyer quelquechose du genre
    [debut]
    HEADER IP
    HEADER TCP
    Données quelconque (il n'a pas compris la request imcp)
    [fin]

    Voila, ca va pas surement pas t'aider mais je vois pas comment tu veux créer un imcp en utilisant le protocole TCP, c contradictoire par rapport au modèle IP. Ce ke tu as fait par rapport au message précedent, tu n'a (enfin je n'ai pas vu le code final) utiliser des packets udp mais des raw sockets. Il y a peut etre confusion puisk'on utilise comme dans le cas udp sendto et recvfrom.

    ZUL

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2002
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 26
    Points : 35
    Points
    35
    Par défaut
    Comme expliqué plus haut le ping est un paquet icmp. Il s'agit d'un protocole qui est situé entre la couche 3 et la couche 4. TCP et UDP sont des protocoles de couche 4.
    Faire un ping en udp ou tcp au sens request et echo est infesable. Pour la bonne et simple raison que tcp et udp utilisent des ports, pour réaliser un ping udp ou tcp il faudrait donc connaitre un port qui serait ouvert et accepterai des connexions entrantes.

    NB : dans l'exemple, tu ouvre une connexion vers un serveur web et tu lui envoi un paquet sans commande http, par conséquent soit il te renvoi une page html d'erreur, soit il t'ignore et coupe la connexion.

Discussions similaires

  1. Protocoles TCP et UDP
    Par gabgab dans le forum Protocoles
    Réponses: 6
    Dernier message: 10/01/2014, 17h38
  2. Réponses: 1
    Dernier message: 09/10/2013, 21h41
  3. Création d'un protocole : TCP ou UDP ?
    Par ram-0000 dans le forum Contribuez
    Réponses: 2
    Dernier message: 24/04/2013, 09h00
  4. Insérer/gérer son protocole TCP/IP, non-http
    Par balibalo dans le forum Wildfly/JBoss
    Réponses: 6
    Dernier message: 29/08/2008, 17h18
  5. [Struts][JSP] Sous-propriété de bean non rapatriée
    Par cowa dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 04/05/2004, 10h25

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