Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Hacer un Pooling

Estas en el tema de Hacer un Pooling en el foro de C/C++ en Foros del Web. Gente estoy trabajando en un programa en c. Yo tengo un cliente que esta conectado a un servidor. Y cada un periodo de tiempo configurable ...
  #1 (permalink)  
Antiguo 22/09/2010, 14:09
 
Fecha de Ingreso: mayo-2006
Mensajes: 79
Antigüedad: 18 años
Puntos: 0
Hacer un Pooling

Gente estoy trabajando en un programa en c. Yo tengo un cliente que esta conectado a un servidor. Y cada un periodo de tiempo configurable por archivo de configuracion se debe consultar a ver si el servidor mando algun mensaje.

Como tendria q hacer esto. Con la funcion select? alguna idea?
  #2 (permalink)  
Antiguo 22/09/2010, 16:05
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Hacer un Pooling

Que es lo que no te sale, el timer o leer en el socket?

Si es lo de socket, usar select es una buena idea, para evitar que s ebloquee el cliente hasta que el server mande informacion. Pero a lo mejor es una gran solucion que se bloquee hasta que se reciba algo!
  #3 (permalink)  
Antiguo 22/09/2010, 16:41
 
Fecha de Ingreso: mayo-2006
Mensajes: 79
Antigüedad: 18 años
Puntos: 0
Respuesta: Hacer un Pooling

Yo lo que quiero es que se quede esperando por un tiempo en el select y si no recibe nada que vuelva al while y entre devuelta al select y se quede ese tiempo de vuelta esperando. Y cuando llegue algo lo atienda


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/times.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define PORT 3490 // puerto al que vamos a conectar
#define MAXDATASIZE 100 // máximo número de bytes que se pueden leer de una vez
void main(int argc, char *argv[])
{
int bandera = 0;
int sockfd, numbytes;
int result;
fd_set readset;
struct timeval tv;
char buf[MAXDATASIZE];
struct hostent *he;
struct sockaddr_in their_addr; // información de la dirección de destino
tv.tv_sec = 5;
tv.tv_usec = 0;
if (argc != 2) {
fprintf(stderr,"usage: client hostname\n");
exit(1);
}
if ((he=gethostbyname(argv[1])) == NULL) { // obtener información de máquina

perror("gethostbyname");
exit(1);
}
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
their_addr.sin_family = AF_INET; // Ordenación de bytes de la máquina
their_addr.sin_port = htons(PORT); // short, Ordenación de bytes de la red
their_addr.sin_addr = *((struct in_addr *)he->h_addr);
memset(&(their_addr.sin_zero),'\0', 8); // poner a cero el resto de la estructura

if (connect(sockfd, (struct sockaddr *)&their_addr,
sizeof(struct sockaddr)) == -1) {
perror("connect");
exit(1);
}


while(bandera == 0){

FD_ZERO(&readset);
FD_SET(sockfd, &readset);

select(sockfd + 1, &readset, NULL, NULL, &tv);
if (FD_ISSET(sockfd,&readset)){
//si entra aca es porque se recibio información
recv(sockfd, buf, MAXDATASIZE -1, 0);
printf("%s\n\n\n",buf);

bandera = 1;

}
}

}
  #4 (permalink)  
Antiguo 22/09/2010, 16:47
 
Fecha de Ingreso: mayo-2006
Mensajes: 79
Antigüedad: 18 años
Puntos: 0
Respuesta: Hacer un Pooling

esta parte es la q tengo duda
Osea quiero que cuando reciba algo salga del while. Y el requerimiento es que pregunte si hay algo cada tanto tiempo, por eso puse el tiempo en el select.


while(bandera == 0){

FD_ZERO(&readset);
FD_SET(sockfd, &readset);

select(sockfd + 1, &readset, NULL, NULL, &tv);
if (FD_ISSET(sockfd,&readset)){
//si entra aca es porque se recibio información
recv(sockfd, buf, MAXDATASIZE -1, 0);
printf("%s\n\n\n",buf);

bandera = 1;

}
}
  #5 (permalink)  
Antiguo 22/09/2010, 19:16
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Hacer un Pooling

Cual es el problema entonces?? No te esta funcionando?
  #6 (permalink)  
Antiguo 22/09/2010, 19:21
 
Fecha de Ingreso: mayo-2006
Mensajes: 79
Antigüedad: 18 años
Puntos: 0
Respuesta: Hacer un Pooling

claro esa parte del while me esta dando mal.
  #7 (permalink)  
Antiguo 22/09/2010, 19:27
 
Fecha de Ingreso: mayo-2006
Mensajes: 79
Antigüedad: 18 años
Puntos: 0
Respuesta: Hacer un Pooling

te paso el pedazito de nuevo

El problema es que el select la primera vez lo hace bien espera su timeout y desp sigue pero las otras veces q entra al while como que lo saltea. Eso me doy cuenta porque me imprime en pantalla el 1 un millon de veces seguidas jaja

while(bandera == 0){

FD_ZERO(&readset);
FD_SET(sockfd, &readset);

select(sockfd + 1, &readset, NULL, NULL, &tv);
printf("1");
if (FD_ISSET(sockfd,&readset)){
//si entra aca es porque se recibio información
pepe = recv(sockfd, buf, MAXDATASIZE -1, 0);
printf("%s\n\n\n\n",buf);

bandera = 1;

}
}
  #8 (permalink)  
Antiguo 22/09/2010, 19:43
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Hacer un Pooling

Osea que en principio se recive la informacion.... ¿Pero del otro lado del scoket, sigue mandando informacion o se cierra?

No estoy mucho en el tema: Pero mira esta pagina: http://www.chuidiang.com/clinux/sock...cketselect.php .Tiene uno lindos ejemplos que te pueden llegar a servir!
  #9 (permalink)  
Antiguo 22/09/2010, 19:47
 
Fecha de Ingreso: mayo-2006
Mensajes: 79
Antigüedad: 18 años
Puntos: 0
Respuesta: Hacer un Pooling

ponele yo establezco la conexion pero el servidor no le manda nada todavia no. Entonces espera una vez ese timeout yy desp las proximas veces que pasa por el select no lo espera ese tiempo asiq debe saltar el select o nose que pasa.
  #10 (permalink)  
Antiguo 22/09/2010, 19:51
 
Fecha de Ingreso: mayo-2006
Mensajes: 79
Antigüedad: 18 años
Puntos: 0
Respuesta: Hacer un Pooling

y en el momento que imprime a mil por hora el 1 que es lo que puse para ver cuantas veces pasa, si en ese momento el servidor le manda algo, corta la impresion del 1 y me imprime la cadena que me mando
  #11 (permalink)  
Antiguo 22/09/2010, 19:58
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Hacer un Pooling

No estoy seguro, pero el seteo del tiempo ponelo dentro del while

Código C++:
Ver original
  1. tv.tv_sec = 5;
  2. tv.tv_usec = 0;

PD: Empeza a usar le highlight por favor!!

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:53.