Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: <<<-Basura->>> en 8 Diciembre 2011, 04:01 am



Título: Sockets y Hilos ?? !!! AYUDA
Publicado por: <<<-Basura->>> en 8 Diciembre 2011, 04:01 am
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:

Código
  1. struct sockaddr_in SERVER =  TCP_SOCK(&SERVER); // sockaddr_in
  2. int SOCKET = socket(AF_INET,SOCK_STREAM,0); // socket
  3. TAMSK TAMSOCK = sizeof(sockaddr); // socklen_t
  4. int ACEPTAR;
  5.  
  6. bind(SOCKET,(sockaddr*)&SERVER,TAMSOCK);
  7. listen(SOCKET,10);
  8.  
  9. if((ACEPTAR = accept(SOCKET, (sockaddr*)&SERVER , &TAMSOCK)) < 0 )//acceptar la conexcion entrante
  10. printf("Servidor Error\n");
  11.  
  12. ZOMBIES(&SERVER,TAMSOCK,ACEPTAR,SOCKET);
  13. close( SOCKET );
  14. close( ACEPTAR );
  15.  

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


Título: Re: Sockets y Hilos ?? !!! AYUDA
Publicado por: BlackZeroX en 10 Diciembre 2011, 07:22 am
El hilo lo puedes crear DESPUES de crear la conexion (aceptarla), es decir, depsues de este if

Código
  1.  
  2. if((ACEPTAR = accept(SOCKET, (sockaddr*)&SERVER , &TAMSOCK)) < 0 )
  3. printf("Servidor Error\n");
  4.  
  5.  

Dulces Lunas!¡.


Título: Re: Sockets y Hilos ?? !!! AYUDA
Publicado por: yovaninu en 10 Diciembre 2011, 17:24 pm
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


Título: Re: Sockets y Hilos ?? !!! AYUDA
Publicado por: <<<-Basura->>> en 10 Diciembre 2011, 21:25 pm
Le hice unos cambios la código:
Código
  1. int ACEPTAR,PID;
  2.  
  3. bind(SOCKET,(sockaddr*)&SERVER,TAMSOCK);
  4. listen(SOCKET,10);
  5.  
  6. if((ACEPTAR = accept(SOCKET, (sockaddr*)&SERVER , &TAMSOCK)) < 0 )
  7. printf("Servidor Error\n");
  8.  
  9. if((PID = fork()) == -1){
  10. printf("Error Creando hilo...");
  11. }else if (PID == 0){
  12. PROCE_HIJO(&SERVER,TAMSOCK,ACEPTAR,SOCKET);
  13. }else{
  14. PROCE_PADRE(&SERVER,TAMSOCK,ACEPTAR,SOCKET);
  15. }
  16.  
  17. //ZOMBIES(&SERVER,TAMSOCK,ACEPTAR,SOCKET); //proce_hijo.hpp
  18.  

Código Padre:
No tiene nada pues lo que quiero es que las conexiones sean atendidas por los hijos del padre :/
Código
  1. void PROCE_PADRE(struct sockaddr_in *SERVER,TAMSK TAMSOCK, int ACEPTAR, int SOCKET){
  2. close( SOCKET );
  3. close( ACEPTAR );
  4. printf("FIN _ padre\n");
  5. exit(0);
  6. }
  7.  

Código Hijo:
Código
  1. void ZOMBIES(struct sockaddr_in *SERVER,TAMSK TAMSOCK, int ACEPTAR, int SOCKET){
  2.  
  3. }
  4. void PROCE_HIJO(struct sockaddr_in *SERVER,TAMSK TAMSOCK, int ACEPTAR, int SOCKET){
  5. char BIENVENIDO[] = "Bienvenido Zombie\n",BUFFER[tBUFFER];
  6. send( ACEPTAR, BIENVENIDO, sizeof(BIENVENIDO), 0);
  7.  
  8. while((strcmp(BUFFER,"FIN"))){
  9. int bytes;
  10. if((bytes = recv(ACEPTAR , BUFFER , TAMSOCK , 0 )) == -1){
  11. printf("Error al resivir datos...\n");
  12. }else{
  13. /****************************************
  14. *
  15. * Aqui van el codigo para resivir datos
  16. *
  17. * **************************************/
  18. printf("%s\n",BUFFER);
  19. }
  20. //if(!(strcmp(BUFFER,"FIN"))) break; //Si Resive la palabra FIN termina el bucle
  21. }
  22. printf("FIN _ Hijo\n");
  23. exit(0);
  24. }
  25.  

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,
Código
  1. while((strcmp(BUFFER,"FIN"))){
  2. }
  3.  

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


Título: Re: Sockets y Hilos ?? !!! AYUDA
Publicado por: BlackZeroX en 11 Diciembre 2011, 03:37 am
@<<<-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!¡.


Título: Re: Sockets y Hilos ?? !!! AYUDA
Publicado por: <<<-Basura->>> en 11 Diciembre 2011, 06:40 am
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 ??


Título: Re: Sockets y Hilos ?? !!! AYUDA
Publicado por: BlackZeroX en 11 Diciembre 2011, 07:59 am
jajaja usas hilos en linux... Debiste aclaralo.

http://linux.die.net/man/2/fork

Dulces Lunas!¡.


Título: Re: Sockets y Hilos ?? !!! AYUDA
Publicado por: <<<-Basura->>> en 11 Diciembre 2011, 09:42 am
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:
Código
  1. if((bytes = recv(ACEPTAR , BUFFER , TAMSOCK , 0 )) == -1){
  2.  

Si recibe "FIN" termina el hijo...
Código
  1. while((strcmp(BUFFER,"FIN"))){