hola tengo una pequeñisima duda, estoy programando sockets, y quiero juntar lo con hilos...
se cuando creer el hilo pero no se donde meter el código.
Bueno:
struct sockaddr_in SERVER = TCP_SOCK(&SERVER); // sockaddr_in
int SOCKET = socket(AF_INET,SOCK_STREAM,0); // socket
TAMSK TAMSOCK = sizeof(sockaddr); // socklen_t
int ACEPTAR;
bind(SOCKET,(sockaddr*)&SERVER,TAMSOCK);
listen(SOCKET,10);
if((ACEPTAR = accept(SOCKET, (sockaddr*)&SERVER , &TAMSOCK)) < 0 )//acceptar la conexcion entrante
printf("Servidor Error\n");
ZOMBIES(&SERVER,TAMSOCK,ACEPTAR,SOCKET);
close( SOCKET );
close( ACEPTAR );
El código esta perfecto, lo que necesito es atender a los clientes por separado metiendo hilos, se lo básico de estos, pero lo que no se es cuando llega un cliente, tengo que cerrar los sockets del padre y aceptar el otro, o como le hago!!! ayuda porfavor
El hilo lo puedes crear DESPUES de crear la conexion (aceptarla), es decir, depsues de este if
if((ACEPTAR = accept(SOCKET, (sockaddr*)&SERVER , &TAMSOCK)) < 0 )
printf("Servidor Error\n");
Dulces Lunas!¡.
Hace un tiempo estaba intentando hacer casi lo mismo, avance un poco pero le deje ahi por falta de tiempo, a ver si te ayuda en algo
http://foro.elhacker.net/programacion_cc/iquestque_esta_mal_con_esta_creacion_de_hilo_thread-t339322.0.html;msg1664556#msg1664556
Le hice unos cambios la código:
int ACEPTAR,PID;
bind(SOCKET,(sockaddr*)&SERVER,TAMSOCK);
listen(SOCKET,10);
if((ACEPTAR = accept(SOCKET, (sockaddr*)&SERVER , &TAMSOCK)) < 0 )
printf("Servidor Error\n");
if((PID = fork()) == -1){
printf("Error Creando hilo...");
}else if (PID == 0){
PROCE_HIJO(&SERVER,TAMSOCK,ACEPTAR,SOCKET);
}else{
PROCE_PADRE(&SERVER,TAMSOCK,ACEPTAR,SOCKET);
}
//ZOMBIES(&SERVER,TAMSOCK,ACEPTAR,SOCKET); //proce_hijo.hpp
Código Padre:
No tiene nada pues lo que quiero es que las conexiones sean atendidas por los hijos del padre :/
void PROCE_PADRE(struct sockaddr_in *SERVER,TAMSK TAMSOCK, int ACEPTAR, int SOCKET){
close( SOCKET );
close( ACEPTAR );
printf("FIN _ padre\n");
exit(0);
}
Código Hijo:
void ZOMBIES(struct sockaddr_in *SERVER,TAMSK TAMSOCK, int ACEPTAR, int SOCKET){
}
void PROCE_HIJO(struct sockaddr_in *SERVER,TAMSK TAMSOCK, int ACEPTAR, int SOCKET){
char BIENVENIDO[] = "Bienvenido Zombie\n",BUFFER[tBUFFER];
send( ACEPTAR, BIENVENIDO, sizeof(BIENVENIDO), 0);
while((strcmp(BUFFER,"FIN"))){
int bytes;
if((bytes = recv(ACEPTAR , BUFFER , TAMSOCK , 0 )) == -1){
printf("Error al resivir datos...\n");
}else{
/****************************************
*
* Aqui van el codigo para resivir datos
*
* **************************************/
printf("%s\n",BUFFER);
}
//if(!(strcmp(BUFFER,"FIN"))) break; //Si Resive la palabra FIN termina el bucle
}
printf("FIN _ Hijo\n");
exit(0);
}
La función ZOMBIE la eliminare después cuando no tenga mas utilidad todavía no lo se...
ahora solo con el cambio que hice se me combierte en bucle infinito,
while((strcmp(BUFFER,"FIN"))){
}
Antes de crear el hijo ese código estaba en la función zombie, y me funcionaba perfectamente,
lo que yo quiero hacer es que exista un padre que lo que haga sea aceptar clientes
digamos:
PADRE-----------HIJO
\\ \\
HIJO HIJO
@<<<-Underwar->>>
Decide en que momento vas a crear el hilo, Antes o despues de aceptar la conexion en mi criterio es DESPUES de aceptarla por otro lado, nada ganas con ponernos mas codigo que no tiene nada que ver (con respecto a tu duda)... almenos que quieras el codigo hecho.
Dulces Lunas!¡.
Antes de poner los hilos, el código servia bien jeje.. cuando hice la división paso un error en ese loop(while)... pero no se porque
tengo dudas con lo que quiero hacer, hice el cambio y agrege el hijo como tu me digistes despues del IF, pero no me sirve esa es mi duda el porque ??
jajaja usas hilos en linux... Debiste aclaralo.
http://linux.die.net/man/2/fork
Dulces Lunas!¡.
Ya cree el hilo, esta en el código observarlo!, pero el hijo debería estar recv() datos verdad, si revive la cadena "FIN", tiene que terminar el bucle, pero nunca termina...
PD. antes de crear el hijo, el programa se me comportaba bien, cual puede ser el error.. ??
EI: JUNTANDO MENSAJES.
Condicion para aceptar mensajes:
if((bytes = recv(ACEPTAR , BUFFER , TAMSOCK , 0 )) == -1){
Si recibe "FIN" termina el hijo...
while((strcmp(BUFFER,"FIN"))){