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