Código de C/Visual C - TRACEROUTE.

Imágen de perfil

TRACEROUTE.gráfica de visualizaciones


C/Visual C

Publicado el 30 de Junio del 2023 por Hilario (122 códigos)
4.412 visualizaciones desde el 30 de Junio del 2023
//////////////////////////////////////////////////////////////////////////////////////
Ad praesens ova cras pullis sunt meliora.
***********************************************
HILARIO IGLESIAS MARTÍNEZ
*******************************************************************
traceroute.c
********************************************************************

Pretendemos en este ejemplo plantear la programación en ansi C, de un TRACEROUTE, lo más sencillo posible. Explicaremos concisamente, en que consiste un traceroute, utilidad habitual en las distros de linux, que se puede instalar con este comando, en mi caso utilizo UBUNTU, y utilizo este comando

sudo apt-get install traceroute

Por ejemplo, en Fedora se podría utilizar este, entre otros.
sudo yum install traceroute
********************************************************************

Un traceroute, también conocido como rastreo de ruta, es una herramienta de red que se utiliza para determinar la ruta que sigue un paquete de datos desde el origen hasta su destino en una red de computadoras. El traceroute muestra la secuencia de saltos o enrutadores a través de los cuales pasa el paquete para llegar a su destino.

Cuando se ejecuta un traceroute, se envían una serie de paquetes ICMP (Internet Control Message Protocol) con incrementos de TTL (Time-to-Live) sucesivos. El TTL especifica el número máximo de saltos que un paquete puede realizar antes de ser descartado. En cada salto, el paquete llega a un enrutador y, si el TTL no ha expirado, el enrutador lo reenvía al siguiente salto en la ruta hacia el destino. Si el TTL llega a cero, el enrutador descarta el paquete y envía un mensaje de error al origen.

Cuando un enrutador recibe un paquete con TTL cero, envía un mensaje de "Tiempo Excedido" (Time Exceeded) al origen. El mensaje de "Tiempo Excedido" incluye la dirección IP del enrutador que lo envió. Utilizando esta información, el traceroute puede construir una lista de direcciones IP de los enrutadores en la ruta hacia el destino.

Además de mostrar las direcciones IP de los enrutadores, el traceroute también proporciona información sobre el tiempo de ida y vuelta (round trip time) entre el origen y cada enrutador en la ruta. Esto permite detectar posibles problemas de latencia en la red.

El traceroute es una herramienta útil para diagnosticar problemas de conectividad en una red y comprender la ruta que sigue el tráfico de red. También se utiliza con fines de seguridad para detectar posibles puntos débiles en la ruta de red y para identificar posibles bloqueos o restricciones en los enrutadores o firewalls.

****************************************************************************
El programa ha sido realizado en
Ubuntu 20.04.6 LTS
IDE Sublime text.
************************************************************
CONPILACIÓN DEL PROGRAMA
gcc -Werror -o traceroute traceroute.c
EJECUCIÓN.
Uso: sudo./traceroute <dirección IP>
////////////////////////////////////////////////////////////////////////

Requerimientos

****************************************************************************
El programa ha sido realizado en
Ubuntu 20.04.6 LTS
IDE Sublime text.
************************************************************

V-0.

Actualizado el 1 de Agosto del 2023 (Publicado el 30 de Junio del 2023)gráfica de visualizaciones de la versión: V-0.
4.414 visualizaciones desde el 30 de Junio del 2023
estrellaestrellaestrellaestrellaestrella
estrellaestrellaestrellaestrella
estrellaestrellaestrella
estrellaestrella
estrella

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/*
Hilario Iglesias Martínez.
------------------------------------
traceroute.c
************
EJECUTAR BAJO SUPERUSUARIO ROOT
----------------------------------
CONPILACIÓN DEL PROGRAMA
gcc -Werror -o traceroute traceroute.c
--------------------------------------
 EJECUCIÓN.
 Uso: sudo./traceroute <dirección IP>
---------------------------------------
*/
 
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <netinet/in.h>
#include <netinet/in_systm.h>
#include <sys/time.h>
#define MAX_HOPS 30
#define PACKET_SIZE 64
 
unsigned short checksum(void *b, int len) {
    unsigned short *buf = b;
    unsigned int sum = 0;
    unsigned short result;
 
    for (sum = 0; len > 1; len -= 2) {
        sum += *buf++;
    }
 
    if (len == 1) {
        sum += *(unsigned char *) buf;
    }
 
    sum = (sum >> 16) + (sum & 0xFFFF);
    sum += (sum >> 16);
    result = ~sum;
 
    return result;
}
 
int main(int argc, char *argv[]) {
    if (argc != 2) {
        printf("Uso: %s <dirección IP>\n", argv[0]);
        return 1;
    }
 
    char *target_ip = argv[1];
 
    struct sockaddr_in dest_addr;
    memset(&dest_addr, 0, sizeof(dest_addr));
    dest_addr.sin_family = AF_INET;
 
    if (inet_pton(AF_INET, target_ip, &(dest_addr.sin_addr)) <= 0) {
        printf("Dirección IP inválida: %s\n", target_ip);
        return 1;
    }
 
    int icmp_socket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
    if (icmp_socket < 0) {
        printf("No se pudo crear el socket ICMP\n");
        return 1;
    }
 
    struct timeval timeout;
    timeout.tv_sec = 1;
    timeout.tv_usec = 0;
 
    if (setsockopt(icmp_socket, SOL_SOCKET, SO_RCVTIMEO, (const char *)&timeout, sizeof(timeout)) < 0) {
        printf("Error al configurar el tiempo de espera para el socket\n");
        return 1;
    }
 
    for (int ttl = 1; ttl <= MAX_HOPS; ++ttl) {
        if (setsockopt(icmp_socket, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl)) < 0) {
            printf("Error al establecer TTL del socket\n");
            return 1;
        }
 
        struct timeval start_time, end_time;
        gettimeofday(&start_time, NULL);
 
        char packet[PACKET_SIZE];
        memset(packet, 0, sizeof(packet));
 
        struct icmphdr *icmp_header = (struct icmphdr *) packet;
        icmp_header->type = ICMP_ECHO;
        icmp_header->code = 0;
        icmp_header->un.echo.id = getpid();
        icmp_header->un.echo.sequence = ttl;
        icmp_header->checksum = 0;
        icmp_header->checksum = checksum(packet, sizeof(struct icmphdr));
 
        if (sendto(icmp_socket, packet, sizeof(struct icmphdr), 0, (struct sockaddr *)&dest_addr, sizeof(dest_addr)) <= 0) {
            printf("Error al enviar el paquete ICMP\n");
            return 1;
        }
 
        char recv_buffer[PACKET_SIZE];
        struct sockaddr_in recv_addr;
        socklen_t recv_addr_len = sizeof(recv_addr);
        ssize_t recv_bytes = recvfrom(icmp_socket, recv_buffer, sizeof(recv_buffer), 0, (struct sockaddr *)&recv_addr, &recv_addr_len);
 
        gettimeofday(&end_time, NULL);
 
        if (recv_bytes < 0) {
            printf("%2d  *\n", ttl);
        } else {
            struct iphdr *ip_header = (struct iphdr *) recv_buffer;
            int ip_header_len = ip_header->ihl * 4;
 
            struct icmphdr *recv_icmp_header = (struct icmphdr *)(recv_buffer + ip_header_len);
 
            if (recv_icmp_header->type == ICMP_TIME_EXCEEDED) {
                struct iphdr *inner_ip_header = (struct iphdr *)(recv_buffer + ip_header_len + sizeof(struct icmphdr));
                struct icmphdr *inner_icmp_header = (struct icmphdr *)(recv_buffer + ip_header_len + sizeof(struct icmphdr) + inner_ip_header->ihl * 4);
 
                if (inner_icmp_header->type == ICMP_ECHOREPLY) {
                    printf("%2d  %s\n", ttl, inet_ntoa(recv_addr.sin_addr));
                    break;
                }
            } else if (recv_icmp_header->type == ICMP_ECHOREPLY) {
                printf("%2d  %s\n", ttl, inet_ntoa(recv_addr.sin_addr));
                break;
            }
 
            printf("%2d  %s\n", ttl, inet_ntoa(recv_addr.sin_addr));
        }
 
        double elapsed_time = (end_time.tv_sec - start_time.tv_sec) * 1000.0 + (end_time.tv_usec - start_time.tv_usec) / 1000.0;
        printf("Tiempo: %.2f ms\n", elapsed_time);
    }
 
    close(icmp_socket);
    return 0;
}



Comentarios sobre la versión: V-0. (0)


No hay comentarios
 

Comentar la versión: V-0.

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad

http://lwp-l.com/s7390