Buenas pues estaba intentando aclararme con la funcion select y ya de paso terminar una practica para la uni asi qe me puse ha hacer un suministrador de numeros aleatorios qe cuando presiones el teclado sin introducir ningun caracter acabe el programa y qe me puedan desconectar remotamente.
bueno pues el problema que tengo es el siguiente la funcion select siempre me devuelve uno cuando lo qe me interesa esqe sea 0 para que salte el timeout de la funcion select.
Lh: No hagas doble post, utiliza el botón modificar.
haber e estado dandole vueltas al tema y creo qe el fallo esta en el servidor para hacer las pruebas adjunto codigo para ver si a alguien se le enciendo la bonbilla por qe la mia esta ya fundida.
bueno pues el problema que tengo es el siguiente la funcion select siempre me devuelve uno cuando lo qe me interesa esqe sea 0 para que salte el timeout de la funcion select.
Código (c) [Seleccionar]
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <fcntl.h>
#include <getopt.h>
#define Puerto 4000
#define N 256
#define STDIN 0
//declaro prototipos
int generador ();
int main(int argc,char *argv[]){
int sockfd,connfd,opc=0,maxfd,ret_select,aleatorio;
struct sockaddr_in servidor;
socklen_t size_server;
char buffer[N];
char ip[20];
char suministrador[15]="suministrador\0";
char valor[2]="s:";
struct timeval tv;
fd_set allset,rset;
//comprobamos los argunmentos qe nos pasan en argc
if(argc!=3){
printf("¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ Error !!!!!!!!!!!!!\n");
printf("Los argumentos pasados no son los correctos.\n");
printf("Uso: nombre_programa -opciones [ argumentos ...]\n");
printf("Salimos del programa.......\n");
exit(1);}
//comprobaremos las opciones que nos han pasado por los comandos
while(opc!=-1){
opc=getopt(argc,argv,valor);
switch(opc){
case 's':
bzero(ip,sizeof(ip));
strcpy(ip,optarg);
break;
}
}
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0){printf("Error en el socket\n");exit(1);}
//inicializamos la structura del servidor(manejador de eventos)
bzero(&servidor,sizeof(servidor));
servidor.sin_family=AF_INET;
servidor.sin_port=htons(Puerto);
servidor.sin_addr.s_addr=inet_addr(ip);
size_server=sizeof(servidor);
connfd=connect(sockfd,(struct sockaddr*)&servidor,size_server);
if(connfd<0){printf("Error en el connect\n");exit(1);}
printf("\n>>>>>>>>SUMINISTRADOR<<<\n");
printf("\n#Conectado con el servidor:%s por el puerto %d\n\n",ip,Puerto);
//enviamos el mensaje suministrador para registranos en el manejador de eventos
write(sockfd,suministrador,sizeof(suministrador));
printf(">>>>>>DIGO :%s\n",suministrador);
//inicializamos los conjuntos de descriptores
FD_ZERO(&rset);
FD_ZERO(&allset);
//añadimos el conjunto de descriptores a observar teclado y el canal de comunicaciones
FD_SET (STDIN,&allset);
FD_SET (sockfd,&allset);
//colocamos el descriptor como el maximo
maxfd=sockfd;
//generamos el primer tiempo de espera con un numero aleatorio y lo guardamos en la structura
aleatorio=tv.tv_sec=generador();
tv.tv_usec=0;
while(1){
//igualamos el conjunto general con el auxiliar
rset=allset;
printf("vamos a esperar %d para enviar el mensaje\n",aleatorio);
ret_select=select(maxfd+1,&rset,NULL,NULL,&tv);
// printf("\n\tret_select=%d\n",ret_select);
//comprovaremos que descriptores an saltado o si ha sido el tiempo
//salta el socket
if(FD_ISSET(sockfd,&rset)==1){
// printf("\n\tsoy yo el qe salta\n\t");
//si recibimos un caracter en blanco qe cierro la conexcion
bzero(buffer,sizeof(buffer));
read(sockfd,buffer,sizeof(buffer));
if(strlen(buffer)==1){
printf("\n>>>>> nos desconectan...\n\t Adios\n");
close (sockfd);
exit(1);
}
}
//salta el teclado
if(FD_ISSET(STDIN,&rset)==1){
bzero(buffer,sizeof(buffer));
fgets(buffer,sizeof(buffer),stdin);
if(strlen(buffer)==1){
printf("\n>>>>> nos desconectamos...\n\t Adios\n");
close (sockfd);
exit(1);
}
}
//salta el timeoout
if(ret_select==0){printf("warning");}
}
close(sockfd);
return 0;
}
int generador(){
//generamos la semilla con el numero de proceso
srand(time(NULL));
//genera el numero aleatorio que ira de 0-10
return rand()%11;
}
Lh: No hagas doble post, utiliza el botón modificar.
haber e estado dandole vueltas al tema y creo qe el fallo esta en el servidor para hacer las pruebas adjunto codigo para ver si a alguien se le enciendo la bonbilla por qe la mia esta ya fundida.
Código (c) [Seleccionar]
// server.c
// DE PRUEBA
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <fcntl.h>
#include <getopt.h>
#define N 256
int main(int argc, char** argv){
int sockfd,bindfd,connfd;
socklen_t size_cliente;
char buffer[N];
struct sockaddr_in servidor,cliente;
//descriptor del socket
sockfd=socket(AF_INET,SOCK_STREAM,0);
//inicializamos la structura
bzero(&servidor,sizeof(servidor));
servidor.sin_family=AF_INET;
servidor.sin_port=htons(4000);
servidor.sin_addr.s_addr=htonl( INADDR_ANY );
//guardamos los recursos del sistema
bindfd=bind(sockfd,(struct sockaddr*)&servidor,sizeof(servidor));
//capaz de escuchar a la vez
listen(sockfd,5);
size_cliente=sizeof(cliente);
while(1){
connfd=accept(sockfd,(struct sockaddr *)&cliente,&size_cliente);
read(connfd,buffer,256);
printf("%s\n",buffer);
close(connfd);
}
close(sockfd);
return 0;
}