| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
Diabliyo
Registrado: 14 Abr 2004 Mensajes: 346 Ubicación: En la Luna
| Publicado: 20/10/2008 7:21 am | | | Título: |
| | WaRc3L escribió: | Diabliyo!, tengo un problema, que es posible que tu me puedes ayudar, es sobre los hilos ( jeje ), resulta, que no se cual libreria tengo que escoger, porque si cogo la libreria <pthread.h>, no me encuentra, y no se como puedo implementarla... la segunda opcion que tengo ( visto de diferentes codigos fuente ) es la liberira <procces.h>, pero la lastima, es que tengo un libro, que explica un capitulo de hilos y hace servir la funcion pthread.h, y como he visto, que usas la clase ( o estructura ) pthread_t, me gustaria saber, como hiciste para que te funcione la libreria pthread.h...
Compilo con g++, bajo Windows.
PD: Otra pregunta, esa libreria solo sirve para C o para C++?, esque yo trabajo con C++
Saludos! |
pthread.h (hilos) y sys/types.h (procesos) son unicamente para sistemas Linux, si estas trabajando sobre windows debes utilizar otras librerias, que la vdd no utilizo porque yo programo solo sobre Linux . Te aconsejo visites la MSDN de Microsoft, ahi deberias encontrar las funciones: CreateThread() y otras que te serviran....
Te dejo los enlaces:
MSDN Index Proccess and Threads http://msdn.microsoft.com/en-us/library/ms686937(VS.85).aspx
P.D: por favor a la otra create un nuevo tema, por que estarias traspapelando y desviando el objetivo de este post.
bye bye _________________
|
| | Volver arriba | |  | cheroky
Registrado: 22 Sep 2005 Mensajes: 2556 Ubicación: Valladolid (España)
| Publicado: 20/10/2008 1:34 pm | | | Título: |
| | Diabliyo escribió: | | pthread.h (hilos) y sys/types.h (procesos) son unicamente para sistemas Linux, si estas trabajando sobre windows debes utilizar otras librerias |
Repito, no hay problema en utilizar ciertas implementaciones POSIX en win32 o cualquier otro sistema, esto es algo natural ya que dicho conjunto de normas aunque íntimamente relacionados con UNIX son "independientes" del sistema. Posix threads se pueden utilizar perfectamente en win32.
S2. _________________ La cuestión no es si hay vida inteligente en otros planetas lejanos. La cuestión es si hay vida inteligente aquí. |
| | Volver arriba | |  | Diabliyo
Registrado: 14 Abr 2004 Mensajes: 346 Ubicación: En la Luna
| Publicado: 21/10/2008 9:23 am | | | Título: |
| Entendido xD, lo que sucede es que no me habia percatado de tu mensaje donde le damas la URL a POSIX para descargarse las src para win.
Retomando mi tema...
El codigo compila perfectamente, asi que he empezado a realizar las primer pruebas, que basicamente es: Levantar el Servidor y utilizar un mini-cliente que hice de forma rapida para ver si el servidor puede sincronizarse conmigo, proporcionarme una session en especial, y recepcionar mis mensajes imprimiendo en pantalla lo que le envio tal cual...
Como nota rapida , antes de decirle cual es el nuevo problema, me gustaria mencionarles como se supone que el server funcionara:
1- Se inicia el servidor (socket, bind, listen) 2- inicia un bucle infinito invocando ACCEPT() en el proceso padre. 3- cuando un cliente es aceptado se crea un proceso hijo. 4- en el proceso hijo invoco una funcion para intercambiar mensajes (saludo, version) 5- el servidor establece una funcion en especial al cliente (session_cliente()). 6- En el proceso hijo creamos dos hilos. 7- En el hilo 1 (recv()), invoco recv() hasta que se obtenga un valor de 0 o -1. Mientras, lo que se reciva lo imprimo en pantalla. 8- El hilo 2 (send), de momento no se utiliza....
El servidor se me queda parado en la parte justamente antes de realizar los dos hilos que les mencione , y por ende, en el lado del Cliente cuando envio cualquier mensaje, el servidor no imprime nada .
El code donde se queda parado el servidor es el siguiente:
| Código: | //insercion y creacion de hilos para session cliente void session_cliente( struct sockaddr_in conexion, int sockfd ) { printf( "Estoy en session cliente().\n\r" ); pthread_t hilo_s, hilo_r; //hilo send, hilo recv char *hilo_s_ret=NULL, *hilo_r_ret=NULL; 8-> printf( "Bloqueando estructura...\n\r" ); pthread_mutex_lock(&mutexbuf); //semaforo rojo raiz_cliente= insertar_cliente( raiz_cliente, raiz_cliente, sockfd, conexion ); //insertamos nodo del cliente pthread_mutex_unlock(&mutexbuf); //semaforo verde printf( "Des-Bloqueando estructura...\n\r" ); printf( "Server creando Hilo de envio\n\r" ); if( pthread_create( &hilo_s, NULL, aryax_data_send, (void *)&sockfd )!=0 ) //creamos hilo de envio send() fprintf( stderr, "\n%s: problemas para crear hilo de envio. %s", inet_ntoa(conexion.sin_addr), strerror(errno) ); else { printf( "Server creando Hilo de recepcion\n\r" ); if( pthread_create( &hilo_r, NULL, aryax_data_get, (void *)&sockfd )!=0 ) //creamos hilo de recepcion recv() fprintf( stderr, "%s: problemas para crear hilo de recepcion. %s\n\r", inet_ntoa(conexion.sin_addr), strerror(errno) ); else //esperamos a los hilos xD { printf( "\nServer esperando hilos finalizen." ); pthread_join( hilo_s, (void **)&hilo_s_ret ); pthread_join( hilo_r, (void **)&hilo_r_ret ); printf( "%s: %s\n\r", inet_ntoa(conexion.sin_addr), hilo_s_ret ); printf( "%s: %s\n\r", inet_ntoa(conexion.sin_addr), hilo_r_ret ); } } } |
Como ven, voy imprimiendo cosas en pantalla para ir detectando DONDE se queda parado el server, asi que el ultimo mensaje es: printf( "Bloqueando estructura...\n\r" ); (linea .
A continuacion la funcion de insercion que se invoca despues de la linea 8.
| Código: | //inserta nuevo nodo al arbol de clientes struct arbol_cliente_struct *insertar_cliente( struct arbol_cliente_struct *raiz, struct arbol_cliente_struct *nodo, int socket_cliente, struct sockaddr_in conexion ) { if( !nodo ) //si es null { nodo= (struct arbol_cliente_struct *)malloc( sizeof(struct arbol_cliente_struct) ); //recervamos memoria nuevo nodo nodo->izq=NULL; //inicializamos nodo->der=NULL; //inicializamos nodo->estado=1; //activado nodo->sockfd= socket_cliente; //insertamos socket nodo->cliente= conexion; //insertamos estructura sockaddr_in memset( &nodo->buffer, '\0', N ); //limpiamos buffer if( socket_cliente<raiz->sockfd ) raiz->izq= nodo; //enlazamos a la izquierda else raiz->der= nodo; //enlazamos a la derecha return nodo; //retornamos la hoja a la recursion } //realizamos recursion if( socket_cliente<raiz->sockfd ) //se insertara la izquierda insertar_cliente( nodo, nodo->izq, socket_cliente, conexion ); //siguiente nodo else //se insertara a la derecha insertar_cliente( nodo, nodo->der, socket_cliente, conexion ); //siguiente nodo return raiz; //finaliza recursion y retorna el arbol } |
Gracias por su pasciencia y atencion !!
bye bye _________________
|
| | Volver arriba | |  | | Diabliyo
Registrado: 14 Abr 2004 Mensajes: 346 Ubicación: En la Luna
| Publicado: 21/10/2008 12:06 pm | | | Título: |
| Solucionado, el error estaba en la funcion insertar, se me paso establecer un IF despues de haber asignado memoria para el nuevo nodo, este if comprueba si el puntero raiz esta vacio, de ser asi, esto nos indica que el valor especificado (socket) es el primero que se insertara en el arbol , por lo raton solo retornamos el nodo.
| Código: | //inserta nuevo nodo al arbol de clientes struct arbol_cliente_struct *insertar_cliente( struct arbol_cliente_struct *raiz, struct arbol_cliente_struct *nodo, int socket_cliente, struct sockaddr_in conexion ) { if( !nodo ) //si es null { nodo= (struct arbol_cliente_struct *)malloc( sizeof(struct arbol_cliente_struct) ); //recervamos memoria nuevo nodo nodo->izq=NULL; //inicializamos nodo->der=NULL; //inicializamos nodo->estado=1; //activado nodo->sockfd= socket_cliente; //insertamos socket nodo->cliente= conexion; //insertamos estructura sockaddr_in memset( &nodo->buffer, '\0', N ); //limpiamos buffer if( !raiz ) return nodo; else if( socket_cliente<raiz->sockfd ) raiz->izq= nodo; //enlazamos a la izquierda else raiz->der= nodo; //enlazamos a la derecha return nodo; //retornamos la hoja a la recursion } //realizamos recursion if( socket_cliente<raiz->sockfd ) //se insertara la izquierda insertar_cliente( nodo, nodo->izq, socket_cliente, conexion ); //siguiente nodo else //se insertara a la derecha insertar_cliente( nodo, nodo->der, socket_cliente, conexion ); //siguiente nodo return raiz; //finaliza recursion y retorna el arbol } |
_________________
|
| | Volver arriba | |  | cheroky
Registrado: 22 Sep 2005 Mensajes: 2556 Ubicación: Valladolid (España)
| Publicado: 22/10/2008 1:35 am | | | Título: |
| Creo que no leiste el post anterior (pag 1) asi que lo muevo de sitio.
Algunas consideraciones:
| Código: | char buf[N]; //buffer /* */ memset( &buf, '\0', N ); |
Aunque no es un error propiamente dicho si se compilase en el modo mas estricto debería dar algún tipo de aviso ya que memset en su primer argumento espera la direccion (puntero) de un bloque de tipo T, aqui se le pasa un tipo puntero a array de tipo T, se se cambiase el bloque por otro asignado de forma dinámica el programa reventaría. En definitiva, sobra el operador de dirección (&).
Si el array solo se "setea" una vez se puede ahorrar una llamada a funcion del modo:
| Código: | char buf[N] = {0};
|
Los cast explícitos
| Código: | /* */
pthread_join( hilo_s, (void **)&hilo_s_ret );
/* */
pthread_exit( (void *)"Error en el socket" );
/* */
|
son totalmente superfluos, son punteros a cualquier tipo de objeto y no necesitan saber de que tipo, lo "contrario" si aplica como ya se menciono anteriormente.
Otra mención son para los comentarios de tipo //, solo validos en C99/C++.
S2. _________________ La cuestión no es si hay vida inteligente en otros planetas lejanos. La cuestión es si hay vida inteligente aquí. |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |