// sunucu.c - Stream soket sunucu
// Versiyon: 020106
// Baris Simsek, <bsimsek@bimel.com.tr>
// http://www.acikkod.org

#include <stdio.h>
#include <string.h>
#include <netdb.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/wait.h>

#define PORT 2222

main(int argc, char *argv[])
{
  int sockfd, new_fd;
  struct sockaddr_in server_addr, client_addr;
  int client_size;
  char buffer[1024];

  printf("%s %d portu uzerinde calismaya basladi...\n",argv[0],PORT);

  if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  {
    perror("- socket acilamadi");
    exit(1);
  }

  memset(&server_addr, 0, sizeof(server_addr));
  server_addr.sin_family = AF_INET;
  server_addr.sin_port = htons(PORT);
  server_addr.sin_addr.s_addr = INADDR_ANY;

  if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1)
  {
    perror("- port atamasi yapilamadi");
    exit(1);
  }

  if (listen(sockfd, 5) != 0)
  {
    perror("- port dinlenemiyor");
    exit(1);
  }

  while(1)
  {
    client_size = sizeof(struct sockaddr_in);
    if ((new_fd = accept(sockfd, (struct sockaddr *)&client_addr, &client_size)) == -1)
    {
      perror("- baglanti kabulu yapilamadi");
      continue;
    }

    printf("%s sunucumuza baglandi...\n",inet_ntoa(client_addr.sin_addr));

    memset(&buffer, 0, sizeof(buffer));
    strcpy(buffer,"Merhaba ");
    strcat(buffer,(char *) inet_ntoa(client_addr.sin_addr));
    strcat(buffer," :)\n");

    if (send(new_fd,&buffer,sizeof(buffer), 0) == -1) perror("mesaj gonderilemedi");
    close(new_fd);
    exit(0);
  }
  close(sockfd);
  while ( waitpid(-1,NULL,WNOHANG) > 0);
}
