#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>

/* Ziel (und Quelle) ist localhost */
#define DEST "127.0.0.1"

int main(void)
  {
  int s;                     /* Sockethandle */
  struct sockaddr_in saddr;  /* IP-Adresse */
  char packet[50];           /* Datenpaket-Puffer */
  int i, fromlen;

  /* RAW-Socket kreieren */
  s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
  if (s == -1)
    {
    perror("socket() ging schief");
    if (errno == EACCES) printf(" (EACCES)\n");
    if (errno == EAFNOSUPPORT) printf(" (EAFNOSUPPORT)\n");
    return 1;
    }

  /* Puffer loeschen */
  memset(packet, 0, sizeof(packet));
  fromlen = sizeof(saddr);

  /* Nachricht empfangen */
  while(1) 
    {
    if (recvfrom(s, (char *)&packet, sizeof(packet), 0,
                   (struct sockaddr *)&saddr, 
                   (socklen_t *)&fromlen) < 0)
      perror("packet receive error");

    /* Nur die Daten nach dem IP-Header ausgeben */
    i = sizeof(struct iphdr);
    while (i < sizeof(packet)) 
      {
      if (packet[i] >= ' ' && packet[i] < 127)
        printf("%c", packet[i]);
      else
        printf(".");
      i++;
      }
    printf("\n");
    }
  exit(0);
  }
