Comment recevoir une demande ICMP en C avec des sockets brutes

C’est une tâche, il faut que ce soit avec des sockets bruts. Je dois programmer un ping icmp simple. Je l’ai utilisé comme base http://www.pdbuchan.com/rawsock/icmp4.c . À la ligne 127 est wlan0, Im utilisant eth0. À 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)) 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és en tant qu’adresse IP de mes machines et que le type icmp est 0 et non 8. Wireshark affiche à la fois la réponse et la demande icmp. Mon recvfrom est probablement erroné, mais j’ai entendu dire que le protocole TCP / IP de Linux traitait peut-être les paquets. Si c’est vrai, quelle est la solution de contournement?

edit: J’ai vérifié cet écouteur de socket brut mais cela n’a pas résolu mon problème.

Je ne pense pas que vous puissiez obtenir une réponse lorsque vous utilisez IPPROTO_RAW.

Vous devez utiliser

 socket (AF_INET, SOCK_RAW, IPPROTO_ICMP); 

Avec IPPROTO_ICMP, vous devez uniquement envoyer un paquet ICMP, pas le paquet IP complet.

Lors de la réception, vous recevez le paquet IP complet et devez extraire la réponse ICMP. Notez que vous recevrez une copie de tous les paquets ICMP envoyés à l’hôte, vous devez donc les filtrer.

Regardez un vrai ping pour l’inspiration.