Cómo hacer que funcione el FD_ISSET?
Wenas a todos! Stoy haciendo un chat en lenguaje C en UNIX. Tengo que usar la structura fd_set y estoy (x ahora) implementando sólo el cliente y un poko tb del servidor (lo justo para que se conecte y le envie mensaje cada 5 segs más o menos al cliente). Pues la cuestión sq me creo una estructura fd_set (la inicializo a cero y le hago 2 FD_SET para el socket para conectarse al servidor y otro para la entrada estándar). Pues luego lo recorro y siempre se queda pillao o en recibir mensajes o en escribirlos y si escribes no recibes y viceversa, es decir, o recibes o escribes mensajes, una de éstas dos. Aki os dejo el código para que os aclareis un poko más.
Gracias de antemano;)
//librerias
#define STDIN 0
main(){
int sock,fdmax,i;
fd_set buffer;
FD_ZERO(&buffer);
sock=socket(AF_INET, SOCK_STREAM, 0);
//connect...
FD_SET(STDIN, &buffer);
FD_SET(sock, &buffer);
fdmax=sock;
do{
select(fdmax,&buffer,NULL,NULL,NULL);
for(i=0;i<=fdmax;i++){
if(FD_ISSET(i,&buffer)){
if(i==sock){
//recibir mensaje
}else if(i==STDIN){
//escribir mensaje
}
}
}
}while(1);
}
Gracias de antemano;)
//librerias
#define STDIN 0
main(){
int sock,fdmax,i;
fd_set buffer;
FD_ZERO(&buffer);
sock=socket(AF_INET, SOCK_STREAM, 0);
//connect...
FD_SET(STDIN, &buffer);
FD_SET(sock, &buffer);
fdmax=sock;
do{
select(fdmax,&buffer,NULL,NULL,NULL);
for(i=0;i<=fdmax;i++){
if(FD_ISSET(i,&buffer)){
if(i==sock){
//recibir mensaje
}else if(i==STDIN){
//escribir mensaje
}
}
}
}while(1);
}
No se si es lo que te pasa, pero debes hacer el FD_ZERO() y los FD_SET() dentro del bucle, justo antes del select().
La función select() modifica buffer para indicarte que entradas tienen datos. Si no lo rellenas cada vez, puedes tener problemas.
Se bueno.
La función select() modifica buffer para indicarte que entradas tienen datos. Si no lo rellenas cada vez, puedes tener problemas.
Se bueno.
Muchas grasias!!!!
Pos si, ese era mi problema! Gracias x resolvérmelo...
Pero... tngo otra preguntita:P
Para escribir el mensaje tngo que pulsar intro (puedes escribir letras antes) y se va al if en el que se escribe y se envia el mensaje, hasta ahí de acuerdo. Pero a mí lo que me gustaría es saber si se puede recoger las letras esas antes de que se pulsara el intro (lo que hay en la entrada estándar) y no tener que hacer un "gets" o "scanf" de manera que se bloquee el programa esperando a que introduzcas el mensaje.
Si me pudieses decir si se puede recoger lo que hay en la entrada estándar y me dices cómo hacerlo (en el caso de que sea así) me harías un gran favor.
Gracias;)
Pos si, ese era mi problema! Gracias x resolvérmelo...
Pero... tngo otra preguntita:P
Para escribir el mensaje tngo que pulsar intro (puedes escribir letras antes) y se va al if en el que se escribe y se envia el mensaje, hasta ahí de acuerdo. Pero a mí lo que me gustaría es saber si se puede recoger las letras esas antes de que se pulsara el intro (lo que hay en la entrada estándar) y no tener que hacer un "gets" o "scanf" de manera que se bloquee el programa esperando a que introduzcas el mensaje.
Si me pudieses decir si se puede recoger lo que hay en la entrada estándar y me dices cómo hacerlo (en el caso de que sea así) me harías un gran favor.
Gracias;)
