Sei sulla pagina 1di 2

#include "mi-protocolo.

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){

if((tamano = recv(sd, &mensaje, sizeof(mensaje), 0))<0){


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

Potrebbero piacerti anche