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
#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){ //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)); break; } } sockfd=socket(AF_INET,SOCK_STREAM,0); //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); //enviamos el mensaje suministrador para registranos en el manejador de eventos write(sockfd,suministrador,sizeof(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; 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)); close (sockfd); } } //salta el teclado if(FD_ISSET(STDIN,&rset)==1){ bzero(buffer,sizeof(buffer)); close (sockfd); } } //salta el timeoout } close(sockfd); return 0; } int generador(){ //generamos la semilla con el numero de proceso //genera el numero aleatorio que ira de 0-10 }
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
// 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); close(connfd); } close(sockfd); return 0; }