#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define PORT    5555
#define MAXMSG  512
int
read_from_client (int filedes)
{
  char buffer[MAXMSG];
  int nbytes;
  nbytes = read (filedes, buffer, MAXMSG);
  if (nbytes < 0)
    {
      /* Okuma hatası. */
      perror ("read");
      exit (EXIT_FAILURE);
    }
  else if (nbytes == 0)
    /* Sosya sonu. */
    return -1;
  else
    {
      /* Veri okundu. */
      fprintf (stderr, "Sunucu: gelen ileti: `%s'\n", buffer);
      return 0;
    }
}
int
main (void)
{
  extern int make_socket (uint16_t port);
  int sock;
  fd_set active_fd_set, read_fd_set;
  int i;
  struct sockaddr_in clientname;
  size_t size;
  /* Soketi oluşturalım ve bağlantıları kabul etmesi için ayarlayalım. */
  sock = make_socket (PORT);
  if (listen (sock, 1) < 0)
    {
      perror ("listen");
      exit (EXIT_FAILURE);
    }
  /* Etkin soketleri ilklendirelim. */
  FD_ZERO (&active_fd_set);
  FD_SET (sock, &active_fd_set);
  while (1)
    {
      /* Etkin soketlerden bilgi gelene kadar baskılayalım. */
      read_fd_set = active_fd_set;
      if (select (FD_SETSIZE, &read_fd_set, NULL, NULL, NULL) < 0)
        {
          perror ("select");
          exit (EXIT_FAILURE);
        }
      /* Girdi bekleyerek bütün soketleri hizmete sokalım. */
      for (i = 0; i < FD_SETSIZE; ++i)
        if (FD_ISSET (i, &read_fd_set))
          {
            if (i == sock)
              {
                /* Dinlenen sokette bağlantı isteği var. */
                int new;
                size = sizeof (clientname);
                new = accept (sock,
                              (struct sockaddr *) &clientname,
                              &size);
                if (new < 0)
                  {
                    perror ("accept");
                    exit (EXIT_FAILURE);
                  }
                fprintf (stderr,
                          "Sunucu: Konak %s, %hd. portundan baglaniyor\n",
                          inet_ntoa (clientname.sin_addr),
                          ntohs (clientname.sin_port));
                FD_SET (new, &active_fd_set);
              }
            else
              {
                /* Bağlı olan sokete veri ulaşıyor. */
                if (read_from_client (i) < 0)
                  {
                    close (i);
                    FD_CLR (i, &active_fd_set);
                  }
              }
          }
    }
}