ttl because easy
This commit is contained in:
43
srcs/main.c
43
srcs/main.c
@ -7,17 +7,15 @@ static char doc[] = "Send ICMP ECHO_REQUEST packets to network hosts.\vMandatory
|
||||
"only) are available only to superuser.";
|
||||
static char args_doc[] = "HOST ...";
|
||||
|
||||
#define ARG_TTL 256
|
||||
|
||||
static struct argp_option options[] = {
|
||||
{0, 0, 0, 0, "Options valid for all request types:\n"},
|
||||
{"verbose", 'v', 0, 0, "verbose output"},
|
||||
{"ttl", ARG_TTL, "N", 0, "specify N as time-to-live"},
|
||||
{0},
|
||||
};
|
||||
|
||||
struct arguments {
|
||||
char* args[1];
|
||||
int verbose;
|
||||
};
|
||||
|
||||
static error_t parse_opt(int key, char* arg, struct argp_state* state) {
|
||||
struct arguments* arguments = state->input;
|
||||
|
||||
@ -25,6 +23,8 @@ static error_t parse_opt(int key, char* arg, struct argp_state* state) {
|
||||
case 'v':
|
||||
arguments->verbose = 1;
|
||||
break;
|
||||
case ARG_TTL:
|
||||
arguments->ttl = strtoul(arg, NULL, 10);
|
||||
case ARGP_KEY_ARG:
|
||||
if (state->arg_num >= 2)
|
||||
argp_usage(state);
|
||||
@ -44,42 +44,37 @@ static struct argp argp = {options, parse_opt, args_doc, doc};
|
||||
|
||||
static bool stop = false;
|
||||
|
||||
int sock = 0;
|
||||
|
||||
void send_ping() {}
|
||||
|
||||
void sig_handler(int sig) {
|
||||
if (sig == SIGINT) {
|
||||
stop = true;
|
||||
} else if (sig == SIGALRM) {
|
||||
send_ping();
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
struct arguments arguments;
|
||||
arguments.verbose = 0;
|
||||
arguments.ttl = 64;
|
||||
argp_parse(&argp, argc, argv, 0, 0, &arguments);
|
||||
|
||||
int sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
|
||||
sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
|
||||
|
||||
if (sock < 0) {
|
||||
dprintf(STDERR_FILENO, "%s: socket() failed: %s\n", argv[0], strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
struct sockaddr_in server;
|
||||
bzero(&server, sizeof(server));
|
||||
|
||||
server.sin_family = AF_INET;
|
||||
if (inet_aton(arguments.args[0], &server.sin_addr) < 1) {
|
||||
dprintf(STDERR_FILENO, "%s: unknown host\n", argv[0]);
|
||||
if (setsockopt(sock, IPPROTO_IP, IP_TTL, &arguments.ttl, sizeof(arguments.ttl)) < 0) {
|
||||
dprintf(STDERR_FILENO, "%s: setsockopt() failed: %s\n", argv[0], strerror(errno));
|
||||
close(sock);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
server.sin_port = htons(0);
|
||||
|
||||
if (bind(sock, (struct sockaddr*)&server, sizeof(server)) < 0) {
|
||||
close(sock);
|
||||
dprintf(STDERR_FILENO, "%s: bind() failed: %s\n", argv[0], strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
struct sigaction sig_handle;
|
||||
|
||||
sig_handle.sa_handler = sig_handler;
|
||||
@ -87,6 +82,11 @@ int main(int argc, char** argv) {
|
||||
sigaction(SIGINT, &sig_handle, 0);
|
||||
sigaction(SIGALRM, &sig_handle, 0);
|
||||
|
||||
// alarm(1);
|
||||
|
||||
unsigned long xmit = 0;
|
||||
unsigned long recv = 0;
|
||||
|
||||
while (true) {
|
||||
|
||||
if (stop) {
|
||||
@ -94,7 +94,8 @@ int main(int argc, char** argv) {
|
||||
}
|
||||
}
|
||||
printf("---- %s ping statistics ----\n", arguments.args[0]);
|
||||
// printf("%d packets transmitted, %d packets received, %d%% packet loss\n");
|
||||
printf("%zu packets transmitted, %zu packets received, %%zu%% packet loss\n", xmit,
|
||||
recv /*, (xmit - recv) / xmit * 100*/);
|
||||
// printf("round-trip min/avg/max/stddev = %f/%f/%f/%f ms\n");
|
||||
close(sock);
|
||||
}
|
5
srcs/util.c
Normal file
5
srcs/util.c
Normal file
@ -0,0 +1,5 @@
|
||||
//
|
||||
// Created by jrathelo on 2/24/25.
|
||||
//
|
||||
|
||||
#include <main.h>
|
Reference in New Issue
Block a user