So empfangen Sie ICMP-Anforderungen in C mit Raw-Sockets

Dies ist eine Aufgabe, es muss mit Raw-Sockets sein. Ich muss einen einfachen ICMP-Ping programmieren. Ich habe das als Basis benutzthttp://www.pdbuchan.com/rawsock/icmp4.c . In Zeile 127 steht wlan0, ich verwende eth0. In Zeile 290 habe ich Folgendes codiert:

`

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

`Das Problem ist, dass ip_dst und ip_src als IP meines Rechners angezeigt werden und icmp als 0 und nicht als 8. Wireshark zeigt sowohl icmp reply als auch request an. Wahrscheinlich ist mein recvfrom falsch, aber ich habe gehört, dass Linux-eigenes TCP / IP die Pakete möglicherweise verarbeitet. Wenn das stimmt, was ist die Problemumgehung dafür?

edit: Ich habe das überprüftRaw-Socket-Listener aber es hat mein problem nicht gelöst.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage