4aBestWord
Messages postés4Date d'inscriptionmardi 2 janvier 2007StatutMembreDernière intervention13 février 2007
-
25 janv. 2007 à 17:43
4aBestWord
Messages postés4Date d'inscriptionmardi 2 janvier 2007StatutMembreDernière intervention13 février 2007
-
13 févr. 2007 à 14:30
bonjour,
j'ai repris un code source en c pour faire un un ping icmp en utilisant les raw sockets sous windows (XP). L'envoie du ping fontionne bien par contre je n'arrive pas à obtenir le retour. Le problème vient surement de l'utilisation de la fonction recv mais je ne vois pas le pb. Si quelqu'un veut bien m'éclairer
le code source compte 2 parties prog.c et packets .h :
/* Envoye du paquet à destination */
if (sendto
(socket, packet, sizeof(packet), 0x0, (struct sockaddr *) &sin,
sizeof(struct sockaddr_in)) == SOCKET_ERROR) {
perror("sendto");
}
/* reception du paquet retour */
else {
retour = recv(socket,buffer,sizeof(buffer),0);
if ( retour == SOCKET_ERROR){
printf("recv : %d",WSAGetLastError());
}//finduif
}//finduelse
system("PAUSE");
free(ip);
free(icmp);
WSACleanup();
return 0;
}
packets.h :
typedef struct iphdr
{
unsigned char ip_verlen;
unsigned char ip_tos;
unsigned short ip_tot_len;
unsigned short ip_id;
unsigned short ip_offset;
unsigned char ip_ttl;
unsigned char ip_protocol;
unsigned short ip_checksum;
unsigned int ip_saddr;
unsigned int ip_daddr;
} IPHDR;
typedef struct icmphdr
{
unsigned char icmp_type;
unsigned char icmp_code;
unsigned short icmp_checksum;
unsigned short icmp_id;
unsigned short icmp_seq;
unsigned long timestamp;
} ICMPHDR;
typedef struct opt_packet
{
char *saddr;
char *daddr;
unsigned int icmp_type;
unsigned int icmp_code;
unsigned int ttl;
int nbpackets;
unsigned int interval;
} OPT_PACKET;
xbabilone
Messages postés47Date d'inscriptionvendredi 18 février 2005StatutMembreDernière intervention 7 janvier 20182 26 janv. 2007 à 17:18
Je suis pas un pro mais t'as configurer ton firewall pour laisser passer les paquets.
Si tu essaye ton code entre deux machines test desactive le firewall sur les deux machines.Car souvent les firewalls sont configurer pour ne pas repondre au ping.
Et sinon good luck .
4aBestWord
Messages postés4Date d'inscriptionmardi 2 janvier 2007StatutMembreDernière intervention13 février 2007 27 janv. 2007 à 10:24
J'y ai pensé aussi au début mais j'ai lancé une capture avec WireShark (ancien ethereal). Et en fait je reçois bien le reply.
Je pense que le pb vient du buffer du retour de la fonction recv() ou bien faut-il faire une synchro entre le sendto et le recv. On m'a parlé de la fonction select().
Voila je cherche toujours donc si quelqu'un a une explication ou une piste, il/elle est le/la bienvenue.