/* Server UDP iterativ (echo)

   Asteapta un mesaj de la clienti; mesajul primit este trimis inapoi
   
   Autor: Sabin-Corneliu Buraga <busaco@infoiasi.ro> (c)1998-2002
   Versiunea: 1.2 (ultima actualizare: 20 aprilie 2002)
*/

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <errno.h>
#include <unistd.h>

/* portul folosit */
#define PORT 8081

/* codul de eroare returnat de anumite apeluri */
extern int errno;

/* programul */
int
main ()
{
  struct sockaddr_in adresa;	/* structurile folosite de server si client */
  struct sockaddr client;
  char buffer[100];		/* mesajul trimis de client */
  int sd;			/* descriptorul de socket */

  /* lansam serverul in fundal... */
  switch (fork ())
    {
    case -1:			/* eroare la fork() */
      perror ("Fork error\n");
      return errno;
    case 0:			/* copilul traieste... */
      break;
    default:			/* parintele moare... */
      printf ("Serverul a fost lansat in fundal...\n");
      exit (0);
    }

  /* cream un socket */
  if ((sd = socket (AF_INET, SOCK_DGRAM, 0)) == -1)
    {
      perror ("Eroare la socket().\n");
      return errno;
    }

  /* pregatim structura folosita de server */
  adresa.sin_family = AF_INET;
  	/* stabilirea familiei de socket-uri */
  adresa.sin_addr.s_addr = htonl (INADDR_ANY);
  	/* acceptam orice adresa */
  adresa.sin_port = htons (PORT);
  	/* utilizam un port utilizator */

  /* atasam socketul */
  if (bind (sd, (struct sockaddr *) &adresa, sizeof (struct sockaddr)) == -1)
    {
      perror ("Eroare la bind().\n");
      return errno;
    }

  /* servim in mod iterativ clientii... */
  while (1)
    {
      int bytes;
      int length = sizeof (client);

      /* citim mesajul primit de la client */
      if ((bytes = recvfrom (sd, buffer, 100, 0, 
                   (struct sockaddr *) &client, &length)) < 0)
	{
	  perror ("Eroare la recvfrom() de la client.\n");
	  return errno;
	}
      /* ...dupa care il trimitem inapoi */
      if (sendto (sd, buffer, bytes, 0, 
                  (struct sockaddr *) &client, length) < 0)
	{
	  perror ("Eroare la sendto() spre client.\n");
	  return errno;
	}
    }				/* while */
}				/* main */

