From 079104af91480bbfd594817512aa332a2ea6b832 Mon Sep 17 00:00:00 2001 From: Namonay Date: Mon, 16 Sep 2024 17:20:33 +0200 Subject: [PATCH] refactor --- ft_ping.h | 1 + main.c | 77 +++++++++++++++++++++---------------------------------- 2 files changed, 30 insertions(+), 48 deletions(-) diff --git a/ft_ping.h b/ft_ping.h index aaac178..2222b2d 100644 --- a/ft_ping.h +++ b/ft_ping.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include diff --git a/main.c b/main.c index 06a3059..64bbb89 100644 --- a/main.c +++ b/main.c @@ -18,91 +18,72 @@ uint16_t calculate_checksum(uint16_t *data, int len) return (~checksum); } -void print_packet(struct icmp_header *packet) -{ - printf("type : %d code : %d\nchecksum : %d id : %d seq : %d\n", packet->type, packet->code, packet->checksum, packet->id, packet->seq); -} - -int ft_ping(int sock, int *seq, struct sockaddr_in src, struct sockaddr_in dst) +int ft_ping(int sock, int seq, struct sockaddr_in dst) { unsigned char data[2048]; - unsigned char data2[2048]; int len; struct icmp_header *icmp_hdr = (struct icmp_header *)data; memset(data, 0, sizeof(data)); - memset(data2, 0, sizeof(data2)); sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); if (sock < 0) { fprintf(stderr, "ERROR : socket() failed\n"); return (0); } - if (getsockname(sock, (struct sockaddr *)&src, &len) < 0) - { - fprintf(stderr, "ERROR : getsockname() failed\n"); - return (0); - } dst.sin_family = AF_INET; memset(icmp_hdr, 0, sizeof(icmp_hdr)); icmp_hdr->type = ICMP_ECHO; icmp_hdr->code = 0; - icmp_hdr->checksum = 0; icmp_hdr->id = getpid(); - icmp_hdr->seq = *seq++; + icmp_hdr->seq = seq; icmp_hdr->checksum = calculate_checksum((uint16_t *)icmp_hdr, sizeof(icmp_hdr)); if (sendto(sock, data, sizeof(data), 0, (struct sockaddr *)&dst, sizeof(dst)) == -1) { fprintf(stderr, "ERROR : sendto() failed\n"); return (0); } - if (recvfrom(sock, data2, sizeof(data2), 0, (struct sockaddr *)&src, &len) == -1) - { - fprintf(stderr, "ERROR : recvfrom() failed\n"); - return (0); - } - struct icmp_header *icmp_recv_hdr = (struct icmp_header *)(data2 + 20); - for (int i = 0; data[i]; i++) - printf("%c", data[i]); - for (int i = 0; data2[i]; i++) - printf("%c", data2[i]); - if (icmp_recv_hdr->type != ICMP_ECHOREPLY || icmp_recv_hdr->code != 0) - { - print_packet(icmp_recv_hdr); - print_packet(icmp_hdr); - fprintf(stderr, "ERROR : invalid packet received (code)\n"); - return (0); - } - if (icmp_recv_hdr->id != icmp_hdr->id) - { - fprintf(stderr, "ERROR : invalid packet received (id is not matching)\n"); - return (0); - } - if (icmp_recv_hdr->seq != icmp_hdr->seq) - { - fprintf(stderr, "ERROR : invalid packet received (sequence is not matching)\n"); - return (0); - } - printf("success"); - close(sock); return (1); } +int ft_recv(int sock, int seq, char *ip) +{ + unsigned char data[2048]; + struct icmp_header *icmp_recv_hdr = (struct icmp_header *)(data + 20); + int len; + struct sockaddr_in addr; + recvfrom(sock, data, sizeof(data), 0, &addr, &len); + + // while (recvfrom(sock, data, sizeof(data), 0, &addr, &len) > 0 && icmp_recv_hdr->type != 0); + printf("%d bytes from %s: icmp_seq:%d time:placeholder", len, ip, icmp_recv_hdr->seq); + +} + int main(int argc, char **argv) { int sock; - struct sockaddr_in src, dst; + struct sockaddr_in dst; int seq = 1; - src.sin_family = AF_INET; + char *ip; if (argc != 2 || argv[1] == NULL || argv[1][0] == 0) { fprintf(stderr, "ERROR : usage : ping {-v?} [ADRESS]\n"); return (0); } - if (gethostbyname(argv[1]) == NULL && inet_aton(argv[1], (struct in_addr *)&dst.sin_addr.s_addr) == 0) + if (inet_aton(argv[1], (struct in_addr *)&dst.sin_addr.s_addr) == 0 && gethostbyname(argv[1]) == NULL) { fprintf(stderr, "ERROR : %s is an invalid adress\n", argv[1]); return (0); } - return (ft_ping(sock, &seq, src, dst)); + ip = inet_ntoa(dst.sin_addr); + bind(sock, &dst, sizeof(dst)); + while (1) + { + ft_ping(sock, seq, dst); + ft_recv(sock, seq, ip); + seq++; + sleep(1); + } + close(sock); + return (0); } \ No newline at end of file