Как получить ICMP-запрос на C с необработанными сокетами

Это задание, оно должно быть с необработанными сокетами. Мне нужно запрограммировать простой ICMP-пинг. Я использовал это как базуhttp://www.pdbuchan.com/rawsock/icmp4.c , В строке 127 находится wlan0, я использую eth0. В строке 290 я закодировал это:

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

«Проблема в том, что ip_dst и ip_src показываются как мои машины»s IP и тип icmp равны 0, а не 8. Wireshark показывает как ответ, так и запрос icmp. Возможно, мой recvfrom неверен, но я слышал, что что-то про собственный TCP / IP в Linux может обрабатывать пакеты. Если это'правда, какой обходной путь для этого?

редактировать: я проверил этонеобработанный сокет но это не решило мою проблему.

Ответы на вопрос(1)

Ваш ответ на вопрос