Comment recevoir la requête ICMP en C avec les sockets raw
.C'est une affectation, il doit être avec les sockets raw. J'ai besoin de programmer un simple ping icmp.
J'ai utilisé cela comme une base http://www.pdbuchan.com/rawsock/icmp4.c . À la ligne 127 est wlan0, Im en utilisant eth0. Dans la ligne 290 j'ai codé ceci:
`
struct sockaddr_in rec;
unsigned char * pkt = (unsigned char *) malloc (IP_MAXPACKET * sizeof (unsigned char));
if (recvfrom (sd, (void*)pkt, IP4_HDRLEN + ICMP_HDRLEN+datalen , 0, NULL, (socklen_t*)sizeof (struct sockaddr)) < 0) {
perror ("recvfrom() failed ");
exit (EXIT_FAILURE);
}
struct ip *ip = (struct ip *)pkt;
struct icmphdr *icmp = (struct icmphdr *)(pkt + IP4_HDRLEN);
printf("%s %s %d\n",(char*)inet_ntoa(*(struct in_addr*)&ip->ip_dst),
(char*)inet_ntoa(*(struct in_addr*)&ip->ip_src),
icmp->type);
free (pkt);
`
Le problème est que ip_dst et ip_src sont affichées, comme mes machines IP et icmp de type 0 et pas 8. Wireshark montre à la fois icmp réponse et de la demande.
Probablement mon recvfrom est mal, mais j'ai entendu quelque chose à propos de linux, TCP/IP propre pourrait être la manipulation de paquets. Si c'est vrai, qu'est-ce que la solution de contournement pour qui?
edit: j'ai vérifié cette raw socket auditeur mais il ne résout pas mon problème.
OriginalL'auteur liwing | 2012-11-24
Vous devez vous connecter pour publier un commentaire.
Je ne pense pas que vous pouvez obtenir une réponse lors de l'utilisation de IPPROTO_RAW.
Vous devez utiliser
Avec IPPROTO_ICMP vous devez seulement envoyer un paquet ICMP, pas l'ensemble du paquet IP.
Lors de la réception toutefois, vous obtiendrez l'ensemble du paquet IP et de tirer la ICMP réponse. Notez que vous obtenez une copie de tous les paquets ICMP envoyés à l'hôte, de sorte que vous devez filtre.
Regarder un vrai ping pour l'inspiration.
lol, je ne sais à propos de cette inet_ntoa problème. Je vous remercie beaucoup. Je ne comprends toujours pas quand je dois utiliser la non-NULL sockaddr paramètre dans recvfrom.
OriginalL'auteur Antoine Mathys