/* 
 * File:   servidor.c
 * Author: cinthiahernendez
 *
 * Created on 11 de agosto de 2009, 17:24
 */

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

/*
 * 
 */
int main(int argc, char** argv) {
    int s, ns, tam, pid;
    struct sockaddr_in serv, client;
    char cad[80];

    fprintf(stdout, "Inicializando servidor...");
    s=socket(AF_INET, SOCK_STREAM, 0);
    
    if(s==-1){
        perror("Error al crear socket");
        exit(-1);
    }
    
    bzero(&serv, sizeof(serv));
    serv.sin_family = AF_INET;
    serv.sin_addr.s_addr= INADDR_ANY;
    serv.sin_port= htons(10800);

    if(bind(s, (struct sockaddr_in *)&serv, sizeof(serv)) == -1){
        perror("No se pudo ligar el socket");
        exit(-1);
    }

    listen(s, 5);

    for(;;){
        tam = sizeof(client);
        if((ns = accept(s, (struct sockaddr_in *)&client, &tam)) == -1) {
            perror("Error al aceptar la conexión");
            exit(-1);
        }

        pid = fork();
        if(pid ==-1){
            perror("Error al crear el proceso hijo");
            exit(-1);
        }
        
        if(pid == 0) { /*Proceso hijo*/
            fprintf(stdout, "Cliente: Dir IP= %s Puerto=%d", inet_ntoa(client.sin_addr.s_addr), ntohs(client.sin_port));

            while(1){
                read(ns, cad, sizeof(cad));
                printf("Cadena recibida=%s", cad);
                if(strcmp(cad, "salir")==0)
                    close(ns);
            }
          }
        }

    return (EXIT_SUCCESS);
}


