Programa em C para monitorar IPs e portas ativas
Publicado por Lauro Salmito Pinheiro 30/07/2009
[ Hits: 10.210 ]
Desenvolvi o PortMonitor para que os administradores de redes e segurança da informação possam gerar um relatório de status dos serviços e ficarem monitorando os serviços de vários servidores.
Distributed under GPLv2
Copyright (c) 2009 Lauro Salmito Pinheiro <laurosalmito@gmail.com>
/*
* PortMonitor
* Monitor dos status das portas dos hosts
*
* Distribute under GPLv2
*
* Copyright (c) 2009 Lauro Salmito Pinheiro <laurosalmito@gmail.com>
*
*/
#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 <time.h>
#include <gtk/gtk.h>
#include <stdlib.h>
#define BUFFSIZE 32
void displayUI(char *str)
{
GtkWidget* mainWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
GtkWidget* label,*box1,*button,*box2;
box1 = gtk_vbox_new (FALSE, 0);
gtk_container_add (GTK_CONTAINER (mainWindow), box1);
gtk_widget_show (box1);
box2 = gtk_hbox_new (TRUE, 10);
gtk_container_set_border_width (GTK_CONTAINER (box2), 0);
gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, FALSE, 0);
label = gtk_label_new (str);
gtk_box_pack_start (GTK_BOX (box1), label, TRUE, FALSE, 0);
gtk_widget_show (box2);
gtk_window_set_default_size(GTK_WINDOW(mainWindow), 300, 200);
gtk_window_set_title(GTK_WINDOW(mainWindow), " ..:: Port Monitor 1.0 ::..");
gtk_window_set_position(GTK_WINDOW(mainWindow), GTK_WIN_POS_CENTER_ALWAYS);
gtk_signal_connect(GTK_OBJECT(mainWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
button = gtk_button_new_with_label (" ! OK ! ");
g_signal_connect_swapped (G_OBJECT (button), "clicked", G_CALLBACK (gtk_widget_destroy), G_OBJECT (mainWindow));
gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
gtk_widget_grab_default (button);
gtk_widget_show (button);
gtk_widget_show (label);
gtk_widget_show_all(mainWindow);
}
void Die(char *mess) { perror(mess); exit(1);}
void trim(char *s, const int len)
{
int end = len - 1;
int start = 0;
int i = 0;
while ((start < len) && (s[start] <= ' '))
{
start++;
}
while ((start < end) && (s[end] <= ' '))
{
end--;
}
if (start > end)
{
memset(s, '{FONTE}', len);
return;
}
for (i = 0; (i + start) <= end; i++)
{
s[i] = s[start + i];
}
memset((s + i), '{FONTE}', len - i);
}
int connections(const char *ip,const char *port)
{
int sock,z,linger_return;
struct sockaddr_in socket_struture;
struct linger a;
a.l_onoff=1;
a.l_linger=0;
sleep(1);
if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
{
Die("Err:");
}
memset(&socket_struture, 0, sizeof(socket_struture));
socket_struture.sin_family = AF_INET;
socket_struture.sin_addr.s_addr = inet_addr(ip);
socket_struture.sin_port = htons(atoi(port));
if ((z = connect(sock,(struct sockaddr *) &socket_struture,sizeof(socket_struture)) == 0)) {
//printf("Porta %s Ativa:. - %d -\n",port,z); //Debug
linger_return = setsockopt(sock, SOL_SOCKET, SO_LINGER,&a, sizeof(a));
close(sock);
return 1;
} else {
// printf("Porta %s Desconectada:. - %d -\n",port,z); //De
linger_return = setsockopt(sock, SOL_SOCKET, SO_LINGER,&a, sizeof(a));
close(sock);
return 0;
}
}
int main(int argc, char *argv[])
{
FILE* filedest,*logfile;
register int val;
typedef char string[50];
string hosts[50];
string portas[50];
int j,i =0;
gtk_init(&argc, &argv);
char server[200];
if (argc>1)
{
if( (argc > 2 || (strcmp(argv[1],"-log")!=0)) && (argc > 2 || (strcmp(argv[1],"-x")!=0)) )
{
printf("Numeros de parametros invalidos. Tente somente um parametro!\n");
exit(1);
}
}
filedest = fopen("dest.conf","r");
if (filedest==NULL)
{
printf("Crie um arquivo no diretorio corrente chamado \"dest.conf\" - com os IPS e portas, separando-os com \":\"\n");
exit(0);
}
while (!feof(filedest))
{
fscanf(filedest,"%s\t%s",hosts[i],portas[i]);
i++;
}
fclose(filedest);
for (;;)
{
time_t mytime;
mytime = time(NULL);
char *time_local;
time_local = ctime(&mytime);
trim(time_local,strlen(time_local));
for (j=0;j<i-1;j++)
{
val = connections(hosts[j],portas[j]);
if (!argv[1])
{
if (val==1)
{
printf("[%s] Host.::. %s - Porta -> %s ATIVA -\n",time_local,hosts[j],portas[j]);
} else {
printf("[%s] Host.::. %s - Porta -> %s DESCONACTDA -\n",time_local,hosts[j],portas[j]);
}
} else {
if(strcmp(argv[1],"-log")==0)
{
//FILE* logfile;
logfile = fopen("monitor.log","a+");
if (val==1)
{
fprintf(logfile,"[%s] Host.::. %s - Porta -> %s ATIVA -\n",time_local,hosts[j],portas[j]);
} else {
fprintf(logfile,"[%s] Host.::. %s - Porta -> %s DESCONACTDA -\n",time_local,hosts[j],portas[j]);
}
fclose(logfile);
}
if(strcmp(argv[1],"-x")==0)
{
if (val==0)
{
logfile = fopen("monitor.log","a+");
fprintf(logfile,"[%s] Host.::. %s - Porta -> %s DESCONACTDA -\n",time_local,hosts[j],portas[j]);
fclose(logfile);
sprintf(server,"Data/Hora::.%s\nHost::.%s\nPorta::.%s\nStatus::.* INATIVO *\n",time_local,hosts[j],portas[j]);
displayUI(server);
gtk_main();
}
}
}
}
}
return(0);
}
Exemplo de Cliente e Servidor Usando Socket no Linux!
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?
Preciso recuperar videos *.mp4 corrompidos (10)
É normal não gostar de KDE? (11)
Secure boot, artigo interessante, nada técnico. (2)









