PING sous protocole TCP

ivdz Messages postés 17 Date d'inscription jeudi 4 juillet 2002 Statut Membre Dernière intervention 5 août 2003 - 16 juin 2003 à 10:11
cs_valoue Messages postés 72 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 13 mai 2011 - 22 juin 2004 à 14:50
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

#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(select(sock_fd+1,&readfds,NULL,NULL,&tv)<0)
{perror("select"); exit(1);}

if(recv(sock_fd, packet_buf, IP_SIZE+ICMP_SIZE, 0)<0)
{perror("recv"); exit(1);}
else {
// Récupération de la partie ICMP du packet
memcpy(icmp, &packet_buf[IP_SIZE], ICMP_SIZE);
}
}while(icmp->type!=0); //ICMP_ECHO REPLY

struct time tps;
gettime((struct time *)&tps);
//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(&tps,(struct time *)icmp->data);

cout<<”Délais : “<<diff<<" sec. "<<endl<<endl;
}//main

3 réponses

roswell117 Messages postés 61 Date d'inscription jeudi 31 janvier 2002 Statut Membre Dernière intervention 18 novembre 2005
16 juin 2003 à 16:17
dsl pour le retard mais j'ai enfin mis ma source pour faire un ping, alors si ca peut t'interesser :

http://www.cppfrance.com/article.aspx?Val=2020
0
cs_valoue Messages postés 72 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 13 mai 2011
22 juin 2004 à 14:20
Salut,
Je developpe actuellement une appli Client/Serveur en C++.
J'ai utiliser les socket pour etablir la communication, des threads traitent les demandes des clients au niveau du serveur...
Pour le moment je testais la communication avec des phrases en caractères ("Salut serveur" ... "Salut client" ...).
Maintenant, je veuxpasser à des choses plus serieuses et plus techniques.

Je veux realiser une méthode qui fait un ping depuis le client vers le serveur. Coté client, no pb !! Je me suis aidée du prog que tu as donné (merci d'ailleurs).
Mais côté serveur, il va falloir que j'analyse les trames recues et formuler la reponse.

Je ne vois pas comment foruler la reponse au ping.
Pourrais tu m'aider stp? du moins m'expliquer comment faire, voire me rediriger vers qqchose d'existant ??

Merci bcp !

Valoue
0
cs_valoue Messages postés 72 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 13 mai 2011
22 juin 2004 à 14:50
Un question de plus:
est ce le systeme qui doit repondre tout seul au ping du client ou dois je formuler la reponse ?
Valoue
0
Rejoignez-nous