Jak otrzymać żądanie ICMP w C z gniazdami surowymi

To jest zadanie, musi być z surowymi gniazdami. Muszę zaprogramować prosty ping icmp. Użyłem tego jako bazyhttp://www.pdbuchan.com/rawsock/icmp4.c . W linii 127 jest wlan0, Im przy użyciu eth0. W linii 290 zakodowałem to:

`

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

`Problem polega na tym, że ip_dst i ip_src są pokazywane jako IP mojego komputera, a icmp typ jako 0, a nie 8. Wireshark pokazuje zarówno odpowiedź icmp, jak i żądanie. Prawdopodobnie mój recvfrom się myli, ale słyszałem coś o własnym TCP / IP w Linuksie, który może obsługiwać pakiety. Jeśli to prawda, jakie jest obejście tego problemu?

edytuj: Sprawdziłem tosurowy odbiornik gniazda ale to nie rozwiązało mojego problemu.

questionAnswers(1)

yourAnswerToTheQuestion