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

/* Port fuer die Requests */
#define PORT 7777

/* Puffergroesse */
#define BUFSIZE 4096

int main (int argc, char **argv) 
  {
  int sock, client, rc, len;
  struct sockaddr_in cliAddr, servAddr;
  char buf[BUFSIZE];
 
  const int y = 1;  /* fuer setsockopt */

  /* Socket erzeugen */
  sock = socket (AF_INET, SOCK_DGRAM, 0);
  if (sock < 0) 
    {
    fprintf(stderr, "Kann Socket nicht öffnen\n");
    exit(1);
    }
    
  /* Lokalen Server Port binden */
  memset( &servAddr, 0, sizeof (servAddr));
  servAddr.sin_family = AF_INET;
  servAddr.sin_addr.s_addr = htonl (INADDR_ANY);
  servAddr.sin_port = htons (PORT);
  setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &y, sizeof(int));
  rc = bind(sock, (struct sockaddr *) &servAddr, sizeof (servAddr));
  if (rc < 0) 
    {
    fprintf (stderr, "Kann Port nicht binden\n");
    exit (1);
    }
  printf ("Warte auf Daten ...\n");

  /* Serverschleife */
  for (;;) 
    {
    /* Puffer initialisieren */
    memset (buf, 0, BUFSIZE);
    /* Nachrichten empfangen */
    len = sizeof (cliAddr);
    client = recvfrom (sock, buf, BUFSIZE, 0,
                   (struct sockaddr *) &cliAddr, (socklen_t*)&len );
    if (client < 0) 
      {
      fprintf(stderr, "Kann keine Daten empfangen ...\n");
      continue;
      }

    /* Erhaltene Nachricht ausgeben */
    printf("Getting Data from %s, UDP-Port %u\n",
            inet_ntoa(cliAddr.sin_addr), ntohs(cliAddr.sin_port));
    printf("Data: %s\n", buf);
    }
  return (0);
  }

