/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Recomendaciones para programas Cliente-Servidor ??
Ir a página Anterior  1, 2
 
      Índice del Foro elrincondelc.com -> Programación en Servidores
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
Diabliyo



Registrado: 14 Abr 2004
Mensajes: 346
Ubicación: En la Luna

MensajePublicado: 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 Very Happy. 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)

MensajePublicado: 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

MensajePublicado: 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 Very Happy, 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 Sad, y por ende, en el lado del Cliente cuando envio cualquier mensaje, el servidor no imprime nada Sad.

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 Cool.

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

MensajePublicado: 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 Very Happy, 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)

MensajePublicado: 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
      Índice del Foro elrincondelc.com -> Programación en Servidores
Página 2 de 2Todas las horas están en GMT - 8 Horas
Ir a página Anterior  1, 2

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com