/* Server TCP 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: 18 aprilie 2002)
*/

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

/* portul folosit */
#define PORT 8081

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

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

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

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

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

  /* punem serverul sa asculte daca vin clienti sa se conecteze */
  if (listen (sd, 5) == -1)
    {
      perror ("Eroare la listen().\n");
      return errno;
    }

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

      printf ("Asteptam la portul %d...\n", PORT);
      fflush (stdout);

      /* acceptam un client (ne vom bloca pina la realizarea conexiunii) */
      client = accept (sd, (struct sockaddr *) &from, &length);

      /* eroare la acceptarea conexiunii de la un client */
      if (client < 0)
	{
	  perror ("Eroare la accept().\n");
	  continue;
	}

      /* am realizat conexiunea, asteptam mesajul... */
      bzero (buffer, 100);
      printf ("Asteptam mesajul...\n");
      fflush (stdout);
      
      /* citirea mesajului */
      if (read (client, buffer, 100) <= 0)
	{
	  perror ("Eroare la read() de la client.\n");
	  close (client);	/* inchidem conexiunea cu clientul */
	  continue;		/* continuam sa ascultam... */
	}
	
      printf ("Mesajul a fost receptionat...\nTrimitem mesajul inapoi...");

      /* returnam mesajul clientului */
      if (write (client, buffer, 100) <= 0)
	{
	  perror ("Eroare la write() catre client.\n");
	  continue;		/* continuam sa ascultam */
	}
      else
	printf (" trasmitere cu succes.\n");
      /* am terminat cu acest client, inchidem conexiunea */
      close (client);
    }				/* while */
}				/* main */

