refactor
This commit is contained in:
@@ -5,6 +5,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
|||||||
77
main.c
77
main.c
@@ -18,91 +18,72 @@ uint16_t calculate_checksum(uint16_t *data, int len)
|
|||||||
return (~checksum);
|
return (~checksum);
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_packet(struct icmp_header *packet)
|
int ft_ping(int sock, int seq, struct sockaddr_in dst)
|
||||||
{
|
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
unsigned char data[2048];
|
unsigned char data[2048];
|
||||||
unsigned char data2[2048];
|
|
||||||
int len;
|
int len;
|
||||||
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));
|
||||||
memset(data2, 0, sizeof(data2));
|
|
||||||
sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
|
sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
|
||||||
if (sock < 0)
|
if (sock < 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "ERROR : socket() failed\n");
|
fprintf(stderr, "ERROR : socket() failed\n");
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
if (getsockname(sock, (struct sockaddr *)&src, &len) < 0)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "ERROR : getsockname() failed\n");
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
dst.sin_family = AF_INET;
|
dst.sin_family = AF_INET;
|
||||||
memset(icmp_hdr, 0, sizeof(icmp_hdr));
|
memset(icmp_hdr, 0, sizeof(icmp_hdr));
|
||||||
icmp_hdr->type = ICMP_ECHO;
|
icmp_hdr->type = ICMP_ECHO;
|
||||||
icmp_hdr->code = 0;
|
icmp_hdr->code = 0;
|
||||||
icmp_hdr->checksum = 0;
|
|
||||||
icmp_hdr->id = getpid();
|
icmp_hdr->id = getpid();
|
||||||
icmp_hdr->seq = *seq++;
|
icmp_hdr->seq = seq;
|
||||||
icmp_hdr->checksum = calculate_checksum((uint16_t *)icmp_hdr, sizeof(icmp_hdr));
|
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)
|
if (sendto(sock, data, sizeof(data), 0, (struct sockaddr *)&dst, sizeof(dst)) == -1)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "ERROR : sendto() failed\n");
|
fprintf(stderr, "ERROR : sendto() failed\n");
|
||||||
return (0);
|
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);
|
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 main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int sock;
|
int sock;
|
||||||
struct sockaddr_in src, dst;
|
struct sockaddr_in dst;
|
||||||
int seq = 1;
|
int seq = 1;
|
||||||
src.sin_family = AF_INET;
|
char *ip;
|
||||||
if (argc != 2 || argv[1] == NULL || argv[1][0] == 0)
|
if (argc != 2 || argv[1] == NULL || argv[1][0] == 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "ERROR : usage : ping {-v?} [ADRESS]\n");
|
fprintf(stderr, "ERROR : usage : ping {-v?} [ADRESS]\n");
|
||||||
return (0);
|
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]);
|
fprintf(stderr, "ERROR : %s is an invalid adress\n", argv[1]);
|
||||||
return (0);
|
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);
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user