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.

La création est sur le lien que j'ai posté. C'est à partir de l'exemple de ce site. J'ai inséré ce code dans la ligne 290 de icmp4.c

OriginalL'auteur liwing | 2012-11-24