Fixed loopback being catched
This commit is contained in:
6
.gitignore
vendored
6
.gitignore
vendored
@@ -1,11 +1,5 @@
|
|||||||
<<<<<<< HEAD
|
|
||||||
.vscode
|
.vscode
|
||||||
.cache
|
.cache
|
||||||
generate_json.py
|
generate_json.py
|
||||||
ft_ping
|
ft_ping
|
||||||
|
|
||||||
=======
|
|
||||||
*.o
|
|
||||||
a.out
|
|
||||||
.vscode
|
|
||||||
>>>>>>> 00fcdacf31561477259f851446360c0b7fc79eb6
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
|
||||||
#define PACKET_SIZE 64
|
#define PACKET_SIZE 56
|
||||||
|
|
||||||
struct icmp_header
|
struct icmp_header
|
||||||
{
|
{
|
||||||
|
|||||||
BIN
objs/src/main.o
BIN
objs/src/main.o
Binary file not shown.
BIN
objs/src/utils.o
BIN
objs/src/utils.o
Binary file not shown.
20
src/main.c
20
src/main.c
@@ -5,7 +5,7 @@ bool loop = true;
|
|||||||
|
|
||||||
int ft_ping(int sock, uint16_t seq, struct sockaddr_in *dst)
|
int ft_ping(int sock, uint16_t seq, struct sockaddr_in *dst)
|
||||||
{
|
{
|
||||||
unsigned char data[64];
|
unsigned char data[PACKET_SIZE];
|
||||||
struct icmp_header *icmp_hdr = (struct icmp_header *)data;
|
struct icmp_header *icmp_hdr = (struct icmp_header *)data;
|
||||||
|
|
||||||
memset(data, 0, sizeof(data));
|
memset(data, 0, sizeof(data));
|
||||||
@@ -25,9 +25,9 @@ int ft_ping(int sock, uint16_t seq, struct sockaddr_in *dst)
|
|||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ft_recv(int sock, uint16_t seq, char *ip, double start)
|
int ft_recv(int sock, uint16_t seq, double start)
|
||||||
{
|
{
|
||||||
unsigned char data[64];
|
unsigned char data[PACKET_SIZE];
|
||||||
struct icmp_header *icmp_hdr = (struct icmp_header *)(data + 20);
|
struct icmp_header *icmp_hdr = (struct icmp_header *)(data + 20);
|
||||||
int n_bytes;
|
int n_bytes;
|
||||||
struct sockaddr_in addr;
|
struct sockaddr_in addr;
|
||||||
@@ -38,16 +38,16 @@ void ft_recv(int sock, uint16_t seq, char *ip, double start)
|
|||||||
memset(data, 0, sizeof(data));
|
memset(data, 0, sizeof(data));
|
||||||
n_bytes = recvfrom(sock, data, sizeof(data), 0, (struct sockaddr *)&addr, (socklen_t *)&len);
|
n_bytes = recvfrom(sock, data, sizeof(data), 0, (struct sockaddr *)&addr, (socklen_t *)&len);
|
||||||
if (n_bytes < 1)
|
if (n_bytes < 1)
|
||||||
return;
|
return (1);
|
||||||
time = (get_timestamp() - start) * 1000;
|
time = (get_timestamp() - start) * 1000;
|
||||||
checksum = icmp_hdr->checksum;
|
checksum = icmp_hdr->checksum;
|
||||||
icmp_hdr->checksum = 0;
|
icmp_hdr->checksum = 0;
|
||||||
if (icmp_hdr->seq != seq || make_checksum((uint16_t *)icmp_hdr, sizeof(*icmp_hdr)) != checksum)
|
if (icmp_hdr->seq != seq || make_checksum((uint16_t *)icmp_hdr, sizeof(*icmp_hdr)) != checksum)
|
||||||
return;
|
return (0);
|
||||||
fill_timestamp_array(&stats, time);
|
fill_timestamp_array(&stats, time);
|
||||||
stats.n_packet_recv++;
|
stats.n_packet_recv++;
|
||||||
printf("%d bytes from %s: icmp_seq=%d ttl=%d time=%5.3fms\n", n_bytes, ip, icmp_hdr->seq, (uint8_t)data[8], time);
|
printf("%d bytes from %s: icmp_seq=%d ttl=%d time=%5.3fms\n", n_bytes, inet_ntoa(addr.sin_addr), icmp_hdr->seq, (uint8_t)data[8], time);
|
||||||
return;
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void handler(int code)
|
void handler(int code)
|
||||||
@@ -90,7 +90,7 @@ bool init_socket(int *sock, struct sockaddr_in *dst, char *host)
|
|||||||
void print_recap(char *ip)
|
void print_recap(char *ip)
|
||||||
{
|
{
|
||||||
printf("--- %s ping statistics ---\n", ip);
|
printf("--- %s ping statistics ---\n", ip);
|
||||||
printf("%d packed transmitted, %d received, %0.0f%% packet loss\n", stats.n_packet_sent, stats.n_packet_recv, (double)(100 - (stats.n_packet_recv / stats.n_packet_sent) * 100));
|
printf("%d packed transmitted, %d received, %0.0f%% packet loss\n", stats.n_packet_sent, stats.n_packet_recv, (double)(stats.n_packet_sent - stats.n_packet_recv) / stats.n_packet_sent * 100);
|
||||||
printf("round-trip min/avg/max/stddev = %5.3f/%5.3f/%5.3f/%5.3f ms\n", get_min(stats.timestamp_array), get_avg(stats.timestamp_array), get_max(stats.timestamp_array), get_stddev(stats.timestamp_array));
|
printf("round-trip min/avg/max/stddev = %5.3f/%5.3f/%5.3f/%5.3f ms\n", get_min(stats.timestamp_array), get_avg(stats.timestamp_array), get_max(stats.timestamp_array), get_stddev(stats.timestamp_array));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,7 +116,7 @@ int main(int argc, char **argv)
|
|||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (argc < 2 || argv[optind] == NULL || argv[optind][0] == 0)
|
if (argc < 2 || argv[optind] == NULL || argv[optind][0] == 0) // optind is a value given by getopt() that's equal to the first argument that isn't a flag
|
||||||
{
|
{
|
||||||
fprintf(stderr, "ERROR : usage : %s {-v?} [ADRESS]\n", argv[0]);
|
fprintf(stderr, "ERROR : usage : %s {-v?} [ADRESS]\n", argv[0]);
|
||||||
return (0);
|
return (0);
|
||||||
@@ -134,7 +134,7 @@ int main(int argc, char **argv)
|
|||||||
start = get_timestamp();
|
start = get_timestamp();
|
||||||
if (ft_ping(sock, seq, &dst) == 0)
|
if (ft_ping(sock, seq, &dst) == 0)
|
||||||
break;
|
break;
|
||||||
ft_recv(sock, seq, ip, start);
|
while (!ft_recv(sock, seq, start));
|
||||||
seq++;
|
seq++;
|
||||||
sleep(1);
|
sleep(1);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user