• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

sergioquintaneiro

[C Linux] Ajuda: Disponibilidade de um WebServer

4 mensagens neste tópico

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  :wallbash:  e nao consigo ver o porque de nao funcionar totalmente.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora