diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index f3c19df..800f93e 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -7,8 +7,8 @@
-
+
{
@@ -30,12 +30,12 @@
-
-
+
+
@@ -44,20 +44,8 @@
-
-
-
-
-
-
-
-
-
-
-
+
-
-
@@ -85,34 +73,34 @@
- {
+ "keyToString": {
+ "ASKED_ADD_EXTERNAL_FILES": "true",
+ "ASKED_SHARE_PROJECT_CONFIGURATION_FILES": "true",
+ "CMake Application.ft_ping.executor": "Debug",
+ "Makefile Target.Makefile.executor": "Run",
+ "RunOnceActivity.RadMigrateCodeStyle": "true",
+ "RunOnceActivity.ShowReadmeOnStart": "true",
+ "RunOnceActivity.cidr.known.project.marker": "true",
+ "RunOnceActivity.git.unshallow": "true",
+ "RunOnceActivity.readMode.enableVisualFormatting": "true",
+ "RunOnceActivity.west.config.association.type.startup.service": "true",
+ "SHARE_PROJECT_CONFIGURATION_FILES": "true",
+ "cf.advertisement.text.overridden": "true",
+ "cf.first.check.clang-format": "false",
+ "cidr.known.project.marker": "true",
+ "git-widget-placeholder": "master",
+ "last_opened_file_path": "/home/user/ft_ping",
+ "node.js.detected.package.eslint": "true",
+ "node.js.detected.package.tslint": "true",
+ "node.js.selected.package.eslint": "(autodetect)",
+ "node.js.selected.package.tslint": "(autodetect)",
+ "nodejs_package_manager_path": "npm",
+ "settings.editor.selected.configurable": "CMakeSettings",
+ "structure.view.defaults.are.configured": "true",
+ "vue.rearranger.settings.migration": "true"
}
-}]]>
+}
@@ -120,7 +108,7 @@
-
+
@@ -133,12 +121,12 @@
-
+
-
+
-
+
@@ -158,9 +146,9 @@
-
+
-
+
@@ -210,6 +198,8 @@
+
+
diff --git a/includes/main.h b/includes/main.h
index 384bddf..c53c9c7 100644
--- a/includes/main.h
+++ b/includes/main.h
@@ -13,4 +13,10 @@
#include
#include
+struct arguments {
+ char* args[1];
+ int verbose;
+ unsigned int ttl;
+};
+
#endif //MAIN_H
diff --git a/srcs/main.c b/srcs/main.c
index 62558f3..99e0c83 100644
--- a/srcs/main.c
+++ b/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);
}
\ No newline at end of file
diff --git a/srcs/util.c b/srcs/util.c
new file mode 100644
index 0000000..83851f6
--- /dev/null
+++ b/srcs/util.c
@@ -0,0 +1,5 @@
+//
+// Created by jrathelo on 2/24/25.
+//
+
+#include