/
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 1, 2  Siguiente
 
      Í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: 08/10/2008 2:27 pm
Título: Recomendaciones para programas Cliente-Servidor ??

Que tal, estoy realizando un proyecto de software y las primeras librerias que estoy realizando son las que se encargaran de la comunicacion entre cliente-servidor, determinar los servidores activos, realizar busquedas en distintos servidores, determinar el numero de saltos que existe entre el servidor y el cliente que demanda una consulta, etc, etc...

Toda esta informacion la quiero guardar para despues manejarla como por ejemplo: generar LOG's, establecer una lista de servers activos, guardar los saltos que existen entre el cliente y el servidor que posee la consulta que desea el cliente, etc, etc....

Pero no me decido en como seria mejor guardar y consultar toda esta informacion sin saturar los recursos de mis servidores !!... utilizas BAses de Datos MySQL/SQL o PostgreSQL y realizar consultas cada ves que se va a realizar: consultas en busqueda de servidores, consultar datos de una session del cliente, consultar informacion mas detallada, etc, etc...

De una forma mas especifica quisiera saber si cada vez que inicie mi servidor deberia cargar toda la informacion VITAL en una estructura formando un ARBOL ORDENADO o bien realizar consultas a MySQL cada vez que exista alguna peticion o consulta...???

bye bye
_________________

Volver arriba
_Leo_



Registrado: 20 Oct 2005
Mensajes: 399
Ubicación: Buenos Aires, Argentina

MensajePublicado: 15/10/2008 8:05 am
Título:

Con respecto a dónde guardar, definitivamente te conviene usar una base de datos. Ya que te ahorrás miles de horas de programación.

El tema de cargar toda la información en memoria no me parece correcto a menos que tengas un muy buen motivo y sepas que la memoria te será suficiente aunque los datos crezcan.

Tus preguntas son específicamente de diseño y es difícil tomarlas sin conocer las restricciones técnicas y funcionales completas del proyecto. Es decir, qué se puede hacer y con qué herramientas, por un lado. Y qué problema busca solucionar tu desarrollo.
_________________
_Leo_
Daphne - administrador de tareas
Cine, tecnología, sociedad
Volver arriba
Diabliyo



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

MensajePublicado: 17/10/2008 5:53 am
Título:

Hola:

He decidido mantener en memoria (arbol) los datos de clientes y servidores activos, de modo que si un cliente pasando algunos 10 minutos deja de tener actividad este se eliminara del arbol y quedara solamente alojado en la BDD, si este vuelve a retormar su actividad solamente se busca en la BDD y se re-inserta en el arbol Very Happy. Los servidores siempre estaran en memoria debido a que son de vital importancia para busquedas e iniciar transferencias de informacion.

Mi proyecto es sobre redes de comunicaciones lan, inalambrica y bluetooth, es un proyecto ams que nada personal, las restricciones son:

- Debes ser realizado en C
- El servidor solo y unicamente compatible en GNU/Linux (32bits y 64bits).
- El cliente debe ser compatible en Windown (32bits y 64bits) y Linux (32bits y 64bits).
- Existiran dos versiones de clientes, Cliente-Admin y Cliente.
- El proyecto inicialmente estara en modo Consola con NCurses.
- La vision es tenerlo listo finalmente con API GTK+.

Actualmente domino todos los temas Very Happy y solo se me dificultaba por el momento tomar la desicion de como tener la informacion, mas que nada por rapidez y flexibilidad.
_________________

Volver arriba
walito



Registrado: 17 Oct 2008
Mensajes: 10

MensajePublicado: 17/10/2008 6:09 am
Título:

Epa, muy bueno. Gran programa.

Lo vas hacer opensource?

Saludos
Volver arriba
Diabliyo



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

MensajePublicado: 17/10/2008 6:12 am
Título:

El modo en que esta funcionando, acepto cliente y hago todo en el sistema es asi (por favor critiquenme u opinen):

1- Inicia el programa.
2- Inicio SERVIDOR (socket, bind, listen).
3- Inicio un bucle infinito (while(1)).
4- Dentro del ciclo while(1) invico algunas funciones de comprobacion de errores, anti-flood, etc...
5- Si el cliente pasa el test de comprobacion, se acepta (accept y se inserta cliente en la estructura arbol) e inicia un proceso hijo para dicho cliente.
6- Dentro del proceso hijo creo dos hilos.
7- En el Hilo 1 invoco con do while la funcion recv, mientras esta en su recepcion difiera de un 0(fin conexion) y -1(erro socket).
8- En el Hilo 2 invoco en un ciclo infinito (while(1)) la funcion send.

En el sistema existen funciones que interactuan fuertemente con la estructura arbol, ya sea escaneando computadora, laptops, celulares, dando de baja nodos, etc, etc... Para todo esto estuve pensando utilizar mutex (exlucion mutua) para evitar estar leyendo y escribiendo al mismo tiempo en el mismo nodo por parte de otros hilos.

Mi Problema es que no logro haer que funcione el mutex, ya que al compilar me sale el siguiente error:

Código:
In file included from main.c:17:
aryax_conexiones.h: In function 'session_cliente':
aryax_conexiones.h:85: error: 'mutexbuf' undeclared (first use in this function)
aryax_conexiones.h:85: error: (Each undeclared identifier is reported only once
aryax_conexiones.h:85: error: for each function it appears in.)
aryax_conexiones.h:89: warning: cast to pointer from integer of different size
aryax_conexiones.h:93: warning: cast to pointer from integer of different size
In file included from aryax_data.h:5,
                 from main.c:18:
aryax_get.c: In function 'aryax_data_get':
aryax_get.c:12: warning: cast from pointer to integer of different size


A contnuacion el codigo con la lineas de error marcadas:

Código:
79//insercion y creacion de hilos para session cliente   
void session_cliente( struct sockaddr_in conexion, int sockfd )
   {
   pthread_t hilo_s, hilo_r; //hilo send, hilo recv
   char *hilo_s_ret=NULL, *hilo_r_ret=NULL;
   
85   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
   
89   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
      {
93      if( pthread_create( &hilo_r, NULL, aryax_data_get, (void *)sockfd )!=0 ) //creamos hilo de recepcion recv()
         fprintf( stderr, "\n%s: problemas para crear hilo de recepcion. %s", inet_ntoa(conexion.sin_addr), strerror(errno) );
      else //esperamos a los hilos xD
         {
         pthread_join( hilo_s, (void **)&hilo_s_ret );
         pthread_join( hilo_r, (void **)&hilo_r_ret );
         
         printf( "\n%s: %s", inet_ntoa(conexion.sin_addr), hilo_s_ret );
         printf( "\n%s: %s", inet_ntoa(conexion.sin_addr), hilo_r_ret );
         }
      }
104}


Y posiblemente se prgeunten donde declaras e inicializas el MUTEX ?, bueno eso lo hago en el codigo main.c, aqui les dejo el codigo:

Código:
//panel principal para manejar el servidor de forma temporal
//utilizando ncurses
void aryax_main( void )
   {
   char _op=0;
   int fd;
   struct sockaddr_in conexion; //socket de entradas
   int size_c= sizeof(struct sockaddr); //dimension de la estructura
      
   printf( "Iniciando Servidor...\n" );
   if( inicia_servidor() ) //si es un entero, entonces iniciamos procesamiento
      {
      pthread_mutex_t mutexbuf; //mutex
      pthread_mutex_init( &mutexbuf, NULL ); //inicializamos mutex
      
      while(1) //ciclo infinito xD
         {
         if( (fd=accept(raiz_server->sockfd, (struct sockaddr *)&conexion, &size_c))==-1 )
            //dejamos notificacion el error en el sistema log
            fprintf( stderr, "\nProblema para atender cliente :: %s", strerror(errno) );
         else
            {
            if( fork()==0 ) //proceso hijo, cliente/servidor entrante
               {
               int a=0;
               
               if( (a=conexion_entrante(conexion, fd))==1 ) //se ha conectado un administrador
                  session_administrador( conexion, fd );
               else if( a==2 ) //se ha conectado un cliente
                  session_cliente( conexion, fd );
               else if( a==6 ) //se ha conectado un botserver aryax
                  session_botserver( conexion, fd );
               else
                  fprintf( stderr, "\n[$l] %s, Conexion rechazada.", getpid(), inet_ntoa(conexion.sin_addr) );
               }
            }
         }
      pthread_mutex_destroy(&mutexbuf); //destruimos mutex
      }
   }

_________________

Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 7516
Ubicación: Mexico

MensajePublicado: 17/10/2008 8:26 am
Título:

El compilador se queja en la linea señalada indicando que el objeto "mutexbuf" no ha sido declarado previamente:
Código:
void session_cliente(struct sockaddr_in conexion, int sockfd)
{
   pthread_t hilo_s, hilo_r;
   char *hilo_s_ret=NULL, *hilo_r_ret=NULL;
   
   pthread_mutex_lock(&mutexbuf); /* <== linea 85 */
   
   /* ... resto de la funcion ... */
}

Esa declaracion debe existir en esa unidad bien dentro de la funcion "session_cliente" (no es el caso) o bien como una declaracion fuera de toda funcion (file scope) y antes del uso del mentado objeto (en la mentada funcion "session_cliente").

La declaracion que mencionas:
Código:
void aryax_main(void)
{
   /* ... */
   
   printf( "Iniciando Servidor...\n" );
   if (inicia_servidor()){
      pthread_mutex_t mutexbuf; //mutex
     
      /* ... */
   }
}

No sirve porque ese objeto "mutexbuf" tiene ambito de bloque (solo puede accederse en el bloque a continuacion del if) y almacenamiento automatico (automatic class storage, esto podria ser un problema ya que el objeto se destruye al terminar el mentado bloque).

Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
Diabliyo



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

MensajePublicado: 17/10/2008 9:32 am
Título:

En pocas palabras la variable mutexbuf no la reconoce el HILO porque esta declarada LOCALMENTE dentro de la funcion aryax_main().

Es importante mencionar (creo yo) que pthread_mutex_t mutexbuf; debe ser declarada antes de fork() para que todos los procesos hijos tengan acceso al mismo recurso (misma variable mutexbuf), y por esa razon la invocaba en aryax_main. Asi cada hijo vera esa misma variable y podra poner el semaforo en rojo o en verde.

La unica solucion es cambiar la variable pthread_mutex_t maxbuffer; como una variable GLOBAL.

El codigo quedo asi:

En aryax_main() se elimino la declaracion de la variable mutexbuf, y se dejo solamente la inicializacion de dicha variable( pthread_mutex_init(mutexbuf, NULL); ).
Código:
//variable mutex global
pthread_mutex_t *mutexbuf;


//panel principal para manejar el servidor de forma temporal
//utilizando ncurses
void aryax_main( void )
   {
   char _op=0;
   int fd;
   struct sockaddr_in conexion; //socket de entradas
   int size_c= sizeof(struct sockaddr); //dimension de la estructura
      
   printf( "Iniciando Servidor...\n" );
   if( inicia_servidor() ) //si es un entero, entonces iniciamos procesamiento
      {
      pthread_mutex_init (mutexbuf, NULL); //inicializamos mutex
      
      while(1) //ciclo infinito xD
         {
         if( (fd=accept(raiz_server->sockfd, (struct sockaddr *)&conexion, &size_c))==-1 )
            //dejamos notificacion el error en el sistema log
            fprintf( stderr, "\nProblema para atender cliente :: %s", strerror(errno) );
         else
            {
            if( fork()==0 ) //proceso hijo, cliente/servidor entrante
               {
               int a=0;
               
               if( (a=conexion_entrante(conexion, fd))==1 ) //se ha conectado un administrador
                  session_administrador( conexion, fd );
               else if( a==2 ) //se ha conectado un cliente
                  session_cliente( conexion, fd );
               else if( a==6 ) //se ha conectado un botserver aryax
                  session_botserver( conexion, fd );
               else
                  fprintf( stderr, "\n[$l] %s, Conexion rechazada.", getpid(), inet_ntoa(conexion.sin_addr) );
               }
            }
         }
      //pthread_mutex_destroy(&mutexbuf); //destruimos mutex
      }
   }


La funcion de session_cliente() no sufrio cambios, se dejo tal cual se expuso arribe en el post anterior...

EL ERROR AHORA es que la compilacion muestra lo siguiente:

Código:
shell# gcc -o main main.c -lpthread

In file included from main.c:17:
aryax_conexiones.h: In function 'session_cliente':
aryax_conexiones.h:89: warning: cast to pointer from integer of different size
aryax_conexiones.h:93: warning: cast to pointer from integer of different size
In file included from aryax_data.h:5,
                 from main.c:18:
aryax_get.c: In function 'aryax_data_get':
aryax_get.c:12: warning: cast from pointer to integer of different size


El error de la linea 89 y 93 corresponden estan en la funcion session_cliente(), y especificamente es cuando se crean los hilos Sad. Ver codigo:

Código:
//insercion y creacion de hilos para session cliente   
void session_cliente( struct sockaddr_in conexion, int sockfd )
   {
   pthread_t hilo_s, hilo_r; //hilo send, hilo recv
   char *hilo_s_ret=NULL, *hilo_r_ret=NULL;
   
   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
   
89-->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
      {
93--->   if( pthread_create( &hilo_r, NULL, aryax_data_get, (void *)sockfd )!=0 ) //creamos hilo de recepcion recv()
         fprintf( stderr, "\n%s: problemas para crear hilo de recepcion. %s", inet_ntoa(conexion.sin_addr), strerror(errno) );
      else //esperamos a los hilos xD
         {
         pthread_join( hilo_s, (void **)&hilo_s_ret );
         pthread_join( hilo_r, (void **)&hilo_r_ret );
         
         printf( "\n%s: %s", inet_ntoa(conexion.sin_addr), hilo_s_ret );
         printf( "\n%s: %s", inet_ntoa(conexion.sin_addr), hilo_r_ret );
         }
      }
   }


El error de la liena 12 corresponde a la funcion aryax_data_get(), y especificamente es en donde se realiza el casting.

Código:
//funcion que realizara el procedimiento de recepcion de informacion brindando
//funciones adicionales para interpretar comandos o iniciar transferencias
void *aryax_data_get( void *sockfd )
   {
   char buf[N]; //buffer
   int file_fd, bytes_r=0; //descriptor nuevo, contador
   
12-->file_fd= (int)sockfd; //casting
   
   do
      {
      memset( &buf, '\0', N ); //limpiamos buffer
      bytes_r=0; //inicializamos recepcion de bytes
      
      bytes_r=recv( file_fd, buf, N, 0); //recivimos datos
      
      if( bytes_r!=-1 && bytes_r!=0 ) //si es distintio de un valor erroneo
         printf( "\nCliente envio: %s", buf ); //imrpimimos contenido
      }while( bytes_r!=-1 && bytes_r!=0 ); //mientra sea distintio de 0 y -1
   
   if( bytes_r==-1 ) //error de socket
      pthread_exit( (void *)"Error en el socket" ); //retornamos datos
   else //cliente cerro conexion
      pthread_exit( (void *)"El cliente cerro la conexion" ); //retornamos dato
   }

_________________

Volver arriba
cheroky



Registrado: 22 Sep 2005
Mensajes: 2556
Ubicación: Valladolid (España)

MensajePublicado: 17/10/2008 12:51 pm
Título:

Código:

void session_cliente( struct sockaddr_in conexion, int sockfd )
{

/*                                        */

if( pthread_create( &hilo_s, NULL, aryax_data_send, (void *)sockfd )!=0 )

/*                                        */


El ultimo parámetro del callback pthread_create es un puntero a void y se utiliza para pasar una lista de argumentos a la funcion hebra, hay que aplicar el operador de dirección y porsupuesto sobra el cast a void* lo mismo en pthread_join.

Para manejar punteros genericos hay que conocer bien las reglas del moldeado de tipo, no basta con poner un (tipo) y esperar que eso funcione.

Código:
 file_fd= (int)sockfd;


Lo correcto es
Código:
file_fd = *(int*)sockfd;



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: 17/10/2008 2:57 pm
Título:

Es lo mismo:

Código:
file_fd= *(int *)sockfd;


Que:

Código:
file_fd= (int **)sockfd;


????...

Tambien me gustaria denotar que file_fd es tipo: int.
_________________

Volver arriba
cheroky



Registrado: 22 Sep 2005
Mensajes: 2556
Ubicación: Valladolid (España)

MensajePublicado: 17/10/2008 6:17 pm
Título:

No es lo mismo, en el primer caso es un cast erroneo de "puntero a puntero", en el segundo un cast a puntero y el operador de indirección o desreferencia.



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: 19/10/2008 9:05 am
Título:

cheroky escribió:
No es lo mismo, en el primer caso es un cast erroneo de "puntero a puntero", en el segundo un cast a puntero y el operador de indirección o desreferencia.



S2.


entonces ya te estas contradiciendo :S, porque en el post ante-anterior me dijiste:

Cita:
Lo correcto es
Código:
file_fd = *(int*)sockfd;


entonces no es correcto, ? o si ? :S !!...

Les repito, la variable file_fd es int, y no es un puntero int...

Esto era lo que yo hacia:

Código:
int file_fd;

file_fd= (int)sockfd;


Como seria correcto entonces :S ??
_________________

Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 7516
Ubicación: Mexico

MensajePublicado: 19/10/2008 9:31 am
Título:

Cuando Cheroky te comenta que debes darle un repaso al tema de punteros y conversiones explicitas se refiere (supongo, si no es asi por favor corrigeme) a este fragmento de tu antepenultimo mensaje:
Código:
void *aryax_data_get(void *sockfd)
{
   char buf[N];
   int file_fd, bytes_r=0;
   
   file_fd = (int) sockfd; //casting
   
   /* ... */
}


En esa funcion "sockfd" es un puntero generico y puede apuntar a lo que sea (siempre que sea un objeto, los punteros a funciones se manejan aparte). Por lo mismo el compilador no puede saber el tipo apuntado como tampoco aplicar aritmetica de punteros, ambos casos no son posibles porque "void" en "void *" significa cualquier tipo.

Si tienes un "void *" y quieres, como es tu caso, obtener el valor del tipo apuntado primero debes convertirlo al tipo de puntero "correcto", eso se realiza mediante la conversion explicita indicada por Cheroky:
Código:
(int *) sockfd;


A partir de ese momento ya no estas trabajando con el puntero generico sino con un puntero a int, el siguiente y ultimo paso (tambien indicado por Cheroky) es, en base a ese puntero, obtener el valor mediante indireccion:
Código:
/* Esta sentencia ... */
file_fd = *(int *) sockfd;

/* ... es equivalente a: */
file_fd = *((int *) sockfd);


Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
Diabliyo



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

MensajePublicado: 19/10/2008 11:24 am
Título:

Listo, gracias por sus comentarios a ambos...

Ahora el codigo a quedado compilando sin errores ni nada Very Happy.

Las modificacione fueron:

Código:
//insercion y creacion de hilos para session cliente   
void session_cliente( struct sockaddr_in conexion, int sockfd )
   {
   pthread_t hilo_s, hilo_r; //hilo send, hilo recv
   char *hilo_s_ret=NULL, *hilo_r_ret=NULL;
   
   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
   
   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
      {
      if( pthread_create( &hilo_r, NULL, aryax_data_get, (void *)&sockfd )!=0 ) //creamos hilo de recepcion recv()
         fprintf( stderr, "\n%s: problemas para crear hilo de recepcion. %s", inet_ntoa(conexion.sin_addr), strerror(errno) );
      else //esperamos a los hilos xD
         {
         pthread_join( hilo_s, (void **)&hilo_s_ret );
         pthread_join( hilo_r, (void **)&hilo_r_ret );
         
         printf( "\n%s: %s", inet_ntoa(conexion.sin_addr), hilo_s_ret );
         printf( "\n%s: %s", inet_ntoa(conexion.sin_addr), hilo_r_ret );
         }
      }
   }


Y el casting quedo asi:
Código:
//funcion que realizara el procedimiento de recepcion de informacion brindando
//funciones adicionales para interpretar comandos o iniciar transferencias
void *aryax_data_get( void *sockfd )
   {
   char buf[N]; //buffer
   int file_fd, bytes_r=0; //descriptor nuevo, contador
   
   file_fd= *(int *)sockfd; //casting
   
   do
      {
      memset( &buf, '\0', N ); //limpiamos buffer
      bytes_r=0; //inicializamos recepcion de bytes
      
      bytes_r=recv( file_fd, buf, N, 0); //recivimos datos
      
      if( bytes_r!=-1 && bytes_r!=0 ) //si es distintio de un valor erroneo
         printf( "\nCliente envio: %s", buf ); //imrpimimos contenido
      }while( bytes_r!=-1 && bytes_r!=0 ); //mientra sea distintio de 0 y -1
   
   if( bytes_r==-1 ) //error de socket
      pthread_exit( (void *)"Error en el socket" ); //retornamos datos
   else //cliente cerro conexion
      pthread_exit( (void *)"El cliente cerro la conexion" ); //retornamos dato
   }

_________________

Volver arriba
WaRc3L



Registrado: 12 Jun 2008
Mensajes: 199
Ubicación: en el registro de la CPU

MensajePublicado: 20/10/2008 1:16 am
Título:

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!
_________________
ToDos PoDeMoS CoMpaRTiR La Luz De La BoMBiTa!
Volver arriba
cheroky



Registrado: 22 Sep 2005
Mensajes: 2556
Ubicación: Valladolid (España)

MensajePublicado: 20/10/2008 1:53 am
Título:

WaRc3L escribió:
Diabliyo!..... 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++


Tendrás que instalar la librería para enlace estático y las runtimes (dlls). Puedes documentarte y bajarlas de aquí: POSIX Threads for Win32. Si utilizas el api de win32 olvidate de POSIX y utiliza _beginthread.

PD: Para otra vez abre un hilo nuevo y no contamines el actual.

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 1 de 2Todas las horas están en GMT - 8 Horas
Ir a página 1, 2  Siguiente

 
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