Jump to content

[C Linux] Ajuda: Disponibilidade de um WebServer


Recommended Posts

Posted

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.

Posted

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"

Posted

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.

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.