ping-fox

GitHub Workflow Status (with branch) Coveralls branch

A ping (ICMP) library - simple to use and no root or setuid required.

Getting Started

In ping-fox a PingSentToken represents an evidence that a ping message has been sent. Each call to PingSender::send_to returns a PingSentToken which can be used to call PingReceiver::recieve. This makes sure that PingSender::recieve is never called without a previous call to PingSender::send_to.

The following example describes how to configure ping-fox and how to send and receive an echo messages and its response.

```

Cargo.toml

[dependencies] ping-fox = "0.1"

```

``` rust // .rs file

use ping_fox::{PingFoxConfig, PingReceive, PingReceiveData, PingSentToken, SocketType}; use std::net::Ipv4Addr; use std::time::Duration;

// ### Configure the library: // - socket_type can be SocketType::RAW or SocketType::DGRAM. // - Use SocketType::DGRAM to avoid the need for elevated privileges. let config = PingFoxConfig { sockettype: SocketType::DGRAM, timeout: Duration::fromsecs(1), channel_size: 1, };

// ### Create a ping sender and a ping receiver. let (mut pingsender, mut pingreceiver) = ping_fox::create(&config).unwrap();

// ### Call PingSender::send_to let token: PingSentToken = pingsender .sendto("127.0.0.1".parse::().unwrap()) .unwrap();

// ### Use the PingSentToken to call PingReceiver::receive. let pingresponse = pingreceiver.receive(token).unwrap();

// ### Read the ping result. match pingresponse { PingReceive::Data(PingReceiveData { packagesize, ipaddr, ttl, sequencenumber, pingduration, }) => { println!( "{packagesize} bytes from {ipaddr}: \ icmpseq={sequencenumber} ttl={ttl} \ time={pingduration:?}", ); } PingReceive::Timeout => { println!("timeout"); } }; ```

Examples

There are some examples in the example folder.

Running the tests

Built With

Contributing

Contributions are welcome. Please open an issue and we can discuss the specifics.

License

This project is licensed under the BSD-3-Clause license - see the LICENSE.md file for details