sergioquintaneiro Posted December 15, 2006 at 03:17 PM Report #70697 Posted December 15, 2006 at 03:17 PM Boas. Tenho de fazer um programa em Linux que determine a disponibilidade de um WebServer, durante um periodo variável de tempo, tenho o programa quase completo, só que não está 100% operacional. Vou colocar o código e se me pudessem ajudar a corrigi-lo, agradecia. AvailEvaluator (determina a disponibilidade do serviço) /*_______________________AvailEvaluator___________________________ Este programa recebe a informação sobre as marcas/TSs de WSClient e determina a disponibilidade/indisponibilidade do serviço. */ #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <string.h> #include <unistd.h> #define PORT 1234 //Porto definido para a comunicação com o WSClient /*--------------------------ERROR FUNCTION------------------------*/ void error(char *msg){ perror(msg); exit(0); } //Estrutura que guarda o timestamp e o status struct data { double time; int status_code; }; /*-----------------------TIME_STATUS FUNCTION----------------------*/ //Função q faz o parsing da string q tem o timestamp e o estado //de forma a separá-los em duas variáveis struct data time_status (char * times){ int i, c=0, b=0, timefull=0; struct data dados; char timestamp[33]; char estado[8]; bzero(timestamp,33); bzero(estado,8); for(i=0; i<strlen(times); i++) { if(times[i] != 32){ // 32 -> código em ASCII q representa o espaço if(!timefull){ timestamp[c++] = times[i]; //vai buscar a info relativa ao timestamp } else { estado[b++]= times[i]; //vai buscar a info relativa ao status } } else{ if(!timefull){ timefull = 1; // ja tem toda a info relativa ao timestamp } } } //printf("time ->%s status_code ->%s\n\n",timestamp,estado); /* atof() -> converte string para float */ dados.time = atof(timestamp); dados.status_code = atoi(estado); //printf("input %s time %f status %i\n",times,dados.time,dados.status_code); return dados; } /*-----------------------INIT_SOCKET FUNCTION----------------------*/ /* Este site serviu-me de referência para a compreensão e implementação de sockets: http://www.cs.rpi.edu/courses/sysprog/sockets/sock.html */ int init_socket(){ int sockfd, newsockfd, portno, n, temp=1; struct sockaddr_in serv_addr; portno = PORT; serv_addr.sin_family = AF_INET; // tipo de endereço da socket /*htons() -> converte o porto do host para network byte order*/ serv_addr.sin_port = htons(portno); // porto de comunicação serv_addr.sin_addr.s_addr = INADDR_ANY; // o endereço IP da máquina em q o prog corre sockfd = socket(AF_INET, SOCK_STREAM, 0); //dominio, tipo e protocolo da socket if (sockfd < 0){ error("ERROR opening socket"); } int optval = 1; if(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const void *)&optval, sizeof(int)) < 0){ error("Socket not reusable"); } // associa a socket a um porto if (bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0){ error("ERROR on binding"); } // o processo fica a escutar as ligacoes listen(sockfd,5); return sockfd; } /*-----------------------ACCEPT_CONNECTION FUNCTION----------------------*/ int accept_connection(int sockfd){ int clilen ,newsockfd; struct sockaddr_in cli_addr; /* The accept() system call causes the process to block until a client connects to the server */ clilen = sizeof(cli_addr); newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); if (newsockfd < 0){ error("ERROR on accept"); } return newsockfd; } /*----------------------------------MAIN---------------------------------*/ int main(int argc, char * const argv[]){ struct data dados; double percent = 0; if(argc > 1){ double start_time=0; int last_status=0; char * event_count = argv[1]; int i; int success_count = 0; int num_cycles = atoi(event_count); int sockfd,newsockfd; int status; char buffer[255]; double result; sockfd = init_socket(); //printf("Number of cycles: %i\n",num_cycles); for(i=0;i<num_cycles;i++){ newsockfd = accept_connection(sockfd); bzero(buffer,255); recv(newsockfd,buffer,sizeof(buffer),0); dados = time_status(buffer); if(!start_time){ start_time = dados.time; } success_count += dados.status_code; result = (double) success_count * 100 / (i + 1); last_status = dados.status_code; close(newsockfd); } close(sockfd); printf(" %i times of %i total requests,\n %.2f percent available \n totaltime %f(s) | available time %f(s)\n ", success_count,num_cycles,result,dados.time - start_time, (double) (dados.time - start_time)*result/100); } else { printf("No number of cycles given\n"); return 1; } } WSClient (envia marcas por cada página solicitada ao WS) #include <stdio.h> #include <sys/time.h> int main(){ struct timeval start; gettimeofday(&start,NULL); printf("%i.%i ",start.tv_sec,start.tv_usec); return 0; } Se me puderem ajudar, agradeço pois ando farto de e nao consigo ver o porque de nao funcionar totalmente.
vbmaster Posted December 15, 2006 at 05:08 PM Report #70714 Posted December 15, 2006 at 05:08 PM Não seria melhor a secção de c?
Hipnoted Posted December 15, 2006 at 08:35 PM Report #70743 Posted December 15, 2006 at 08:35 PM Dava geito era saber onde está a falhar o programa... Nós não podemos adivinhar tens de nos dizer. Não seria melhor a secção de c? ele se calhar pensou que por fazer o trabalho em linux que tinha de postar aqui mas realmente a secção disto é C. "Nunca discutas com um idiota. Eles arrastam-te até ao seu nível e depois ganham-te em experiência"
sergioquintaneiro Posted December 19, 2006 at 06:48 PM Author Report #71412 Posted December 19, 2006 at 06:48 PM Boas. É assim, o programa tem que (deveria de) ser feito com 2 sockets e eu só utilizo um. Obrigado a quem respondeu e desculpa a quem só soube dizer que nao era o local correcto de post.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now