This was originally written for the Cloudflare Systems Internship
application. It is written in Rust and directly interfaces with
the Linux syscalls socket(), sendto(), recv(), etc. For reference,
as of time of writing, uname reports 5.2.21 #1-NixOS SMP x86_64 GNU/Linux.
Repository location github.com/zyklotomic/ping
cargo build
The resulting binary will be located at./target/debug/ping.
ping 1.0.0
Ethan Tsz Hang Kiang @zyklotomic
A cute little `ping` in Rust
USAGE:
ping [OPTIONS] <dest>
FLAGS:
-h, --help Prints help information
-V, --version Prints version information
OPTIONS:
-c, --count <count> Stop sending after <count> many packets have been sent.
-i, --interval <interval> Wait <interval> seconds between sending each packet. Default is one second.
-t <ttl> ttl
ARGS:
<dest> Target destination. Only Ipv4 supported
Relevant permissions need to be set to run ping.
Update sysctl paramater net.ipv4.ping_group_range to include your group id (id -g).
$ id -g
1000
$ sudo sysctl -w net.ipv4.ping_group_range="0 1000"
net.ipv4.ping_group_range = 0 2000
To run without root, enable 'setuid' bit.
$ sudo chown root:root ./target/debug/ping
$ sudo chmod u+s ./target/debug/ping
$ sudo chmod g+s ./target/debug/ping
Directly pulled from https://echorand.me/posts/my-own-ping/ . Pulled from under Implementation and Parting Notes. Thank you to Amit for that very helpful article with which I wouldn't have been able to write this without.
Complete refactoring of this so that it isn't such spaghetti. Use tokio? Check the code comments.