h"// Archivo de cabezera creado para facilitar la creacio
n de sockts #include "conexion.h" // Archivo de cabezera creado para facilitar la creacion d e sockets #define LONG 30 // Define el tamano del msg que se va a mandar void * ManejarCliente(void * dir_socket); // Funcion que va a ser enviada en un thread int main(int argc, char *argv[]){ int sd_server, new_sd, ret; // Varibales para la creacion int long_cliente; // Variable para la longitud int tamano_m_recibido; // longitud del tamano recibido char buffer[LONG]; // arreglo del mensaje MENSAJE mensaje; // varible de tipo MENSAJE definida en los archivos de cabezera pthread_t tid; // variable de tipo PTHREAD_T para la creacion de un hilo pthread_attr_t attr; // varible para los atributos de un hilo struct sockaddr_in dir_cliente;// estructura definida en archivo de cab ecera para la creacion de sockets if(argc != 3){ fprintf(stderr, "Nmero de parmetros incorrecto. Use %s <ip> <puert o>\n", argv[0]); exit(-1); }// verifica que los argumentos de entrada sean ingresados correctamente if((sd_server = EscucharTCP(argv[1], atoi(argv[2]))) < 0){ exit(-1); }// Crea el servidor y lo pone en forma de escucha long_cliente = sizeof(dir_cliente); // guarda el tamano de la estructura del cliente for(;;){ if((new_sd = accept(sd_server, (struct sockaddr *) &dir_cliente, &long_cliente))<0){ fprintf(stderr, "Error al usar accept!\n"); continue; }// Verifica si la creacion del socket fue correcta printf("\nCliente %s se ha conectado y ser atendido en el socket %i\n", inet_ntoa(dir_cliente.sin_addr), new_sd);// Tran sforma la direccion pthread_attr_init(&attr); // inicializa los atributos de un hilo ret = pthread_create(&tid, &attr, ManejarCliente, (void *) &new_ sd);// se crea un hilo if(ret){ fprintf(stderr, "Error al crear el hilo\n"); continue; }// Verifica si el hilo se creo de manera correcta }// lazo infinito para una infinita creacion de threads para que el serv idor siga escuchando } void * ManejarCliente(void * dir_socket){ int sd = *((int *) dir_socket); int tamano; MENSAJE mensaje; while(1){
fprintf(stderr, "Error recv()!\n"); pthread_cancel(); } // verifica que se haya enviado el thread correctamente printf("%d: %s", sd, mensaje.datos); if((send(sd, &mensaje, sizeof(mensaje), 0)) < 0 ){ fprintf(stderr, "Error send()\n"); pthread_cancel(); }//vrifica que se haya mandando el mensaje } }// Funcion que va a ser enviada al thread para ser ejecutado