Usando sockets para monitorar servidores
Publicado por Davidson Esteves Nunes 26/10/2005
[ Hits: 9.753 ]
Script em C que monitora servidores de rede, executa uma ação quando um deles para de responder e executa outra ação quando o mesmo fica on-line.
/*
* NetCheck Teste de rede
*
* Version: 1.0 19/10/2005
*
* Authors: Davidson Esteves Nunes
*/
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <signal.h>
#define BUFFSIZE 32
void Die(char *mess) { perror(mess); exit(1); }
int test(char *ip, char *porta);
void aviso(int);
int main(int argc, char *argv[]) {
char downscript[128]; //responsavel pela acao a ser executada caso nao consiga conectar
char upscript[128]; //responsavel pela acao a ser executada quando eu reconectar
int r;
int status, tempo, tempodefault, contador;
fprintf(stdout, "NetCheck - Monitor de serviços de rede (by Davidson)!\n");
if (argc != 5) {
fprintf(stderr, "Sintaxe: client <server_ip> <porta> <down-script> <up-script>\n");
exit(1);
}
if(fork()) {exit(1);} //fica rodando em segundo plano
strcpy(downscript, argv[3]);
strcpy(upscript, argv[4]);
tempodefault = 5;
contador = 1;
tempo = tempodefault; //a checagem é feita a cada n segundos
while (1) {
r = test(argv[1], argv[2]);
if(r == 0) {
contador++;
if(contador==4) {
//não roda o downscript logo de cara, o servidor pode ter demorado a responder
system(downscript);
contador = 1;
}
status = 0;
tempo = 1; //tenta recuperar o mais rapido possível
} else {
if(status == 0) {
//signigica que houve uma queda e ainda estamos em down, mas agora como o host respondeu,
//podemos rodar o script de reativação
system(upscript);
status = 1;
tempo = tempodefault; //volta o tempo de checagem ao normal
contador = 1;
}
}
alarm(0);
sleep(tempo);
//fprintf(stdout, "Testando: \n");
}
exit(0);
}
int test(char *ip, char *porta)
{
//executa um teste de conexão no ip selecionado e retorna 1 para online e 0 para off-line
int sock;
char buffer[BUFFSIZE];
struct sockaddr_in echoserver;
unsigned int echolen;
int received = 0;
/* Create the TCP socket */
if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
Die("Não consegui criar o socket!!!");
}
/* Construct the server sockaddr_in structure */
memset(&echoserver, 0, sizeof(echoserver)); /* Clear struct */
echoserver.sin_family = AF_INET; /* Internet/IP */
echoserver.sin_addr.s_addr = inet_addr(ip); /* IP address */
echoserver.sin_port = htons(atoi(porta)); /* server port */
struct sigaction sigact;
sigset_t sigset;
/* set up handler for the timer alarm */
sigemptyset(&sigset); /* create an empty signal mask set */
sigact.sa_handler = aviso; /* use the wakeup() handler */
sigact.sa_mask = sigset; /* use the empty sigset */
sigact.sa_flags = 0; /* no flags needed */
sigaction(SIGALRM, &sigact, NULL);
alarm(1); /* set the timer alarm for 1 second */
if (connect(sock, (struct sockaddr *) &echoserver, sizeof(echoserver)) < 0) {return(0);}
close(sock);
return(1);
}
void aviso(int s)
{
//alarm(1); /* what would happen without this statement? */
//fprintf(stdout, "Alarme!\n");
}
Simples servidor http com concorrência feito em C
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Mint Xfce não mantém a conexão no wi-fi (2)
Problemas com Driver NVIDIA (5)
Warcraft II Remastered no Linux? (8)









