Como receber uma solicitação ICMP em C com soquetes brutos

Esta é uma tarefa, tem que ser com soquetes brutos. Eu preciso programar um simples icmp ping. Eu usei isso como basehttp://www.pdbuchan.com/rawsock/icmp4.c . Na linha 127 é wlan0, estou usando eth0. Na linha 290 eu codifiquei isto:

`

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

`O problema é que ip_dst e ip_src estão sendo mostrados como IP de minhas máquinas, e icmp como 0 e não como 8. Wireshark mostra a resposta e solicitação de icmp. Provavelmente, minha recvfrom está errada, mas ouvi algo sobre o próprio TCP / IP do Linux estar manipulando os pacotes. Se isso for verdade, qual é a solução para isso?

edit: chequei issoouvinte de soquete bruto mas isso não resolveu o meu problema.

questionAnswers(1)

yourAnswerToTheQuestion