// Vamos a desarrolar el suministrador de numeros aleatorios // name: Miguel Alarcon Ortiz //fecha 24.07.2010 #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 else 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 else {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; }
|