Cómo recibir una solicitud ICMP en C con sockets crudos

.Esta es una tarea, tiene que ser con sockets en bruto. Necesito programar un ping icmp simple. Usé esto como una basehttp://www.pdbuchan.com/rawsock/icmp4.c . En la línea 127 está wlan0, estoy usando eth0. En la línea 290 codifiqué esto:

`

 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);

`El problema es que ip_dst y ip_src se muestran como la IP de mis máquinas y el tipo icmp como 0 y no 8. Wireshark muestra tanto la respuesta como la solicitud de icmp. Probablemente mi respuesta sea incorrecta, pero escuché algo acerca de que el propio TCP / IP de Linux podría estar manejando los paquetes. Si eso es cierto, ¿cuál es la solución para eso?

edición: he comprobado estooyente de socket en bruto&nbsp;Pero no resolvió mi problema.