Expand description

§Netbeat
A fast, minimal, & lightweight tool for testing network upload and download speeds between a client and server, written entirely in Rust.
Netbeat provides both a command-line interface and a library for measuring network performance, monitoring connectivity, and analyzing network behavior, primarily oriented towards hobbyists and home lab enthusiasts.

§Features
- š Fast: Optimized for high-performance network testing written in pure Rust
- š§ Configurable: Options for customizing speed tests
- š Detailed Metrics: Upload/download speeds, latency, and more
- š Cross-platform: Works on Linux, macOS, and Windows
- š JSON Output: Perfect for automation and scripting
§Use Cases
- Home Lab Testing: Validate network performance between home servers
- Network Troubleshooting: Identify bandwidth bottlenecks
- Infrastructure Monitoring: Automated network performance checks
§Installation
Requires Rust toolchain.
§Binary Crate (CLI)
cargo install netbeat
§Library Crate
cargo add netbeat
§Quick Start
- Install:
cargo install netbeat
- Start a server:
netbeat serve
- Run a test from another machine:
netbeat run <server-ip>
§Usage
§Command Line Interface
$ netbeat --help
A fast, minimal, & lightweight Rust tool for testing network upload and download speeds between a client and server.
Usage: netbeat <COMMAND>
Commands:
run Run a speed test against a target server
serve Start listening for incoming connections on a target server
help Print this message or the help of the given subcommand(s)
Options:
-h, --help Print help
-V, --version Print version
§Running Speed Tests
Run a basic speed test:
$ netbeat run 10.1.1.11
š Connected to server at 10.1.1.11:5050
š Running ping test... ā
Completed.
š Ping Report
==== ================== ==========
š Packets sent 20
š Packets received 20
š Packet loss 0.0%
⾠Minimum ping 72.76µs
⬠Maximum ping 363.34µs
ā¼ļø Average ping 115.91µs
==== ================== ==========
š Running upload speed test... ā
Completed.
ā¬ļø Upload Report
==== ===================== =============
š Uploaded 1.15 GB
ā° Upload time 10.01s
ā« Upload speed (Mbps) 921.38 Mbps
ā« Upload speed (MB/s) 115.17 MB/s
==== ===================== =============
š Running download speed test... ā
Completed.
ā¬ļø Download Report
==== ======================= =============
š Downloaded 1.13 GB
ā° Download time 10.00s
⬠Download speed (Mbps) 906.71 Mbps
⬠Download speed (MB/s) 113.34 MB/s
==== ======================= =============
š¦ Netbeat Report
==== ======================= =============
š Packets sent 20
š Packets received 20
š Packet loss 0.0%
⾠Minimum ping 72.76µs
⬠Maximum ping 363.34µs
ā¼ļø Average ping 115.91µs
š Uploaded 1.15 GB
ā° Upload time 10.01s
ā« Upload speed (Mbps) 921.38 Mbps
ā« Upload speed (MB/s) 115.17 MB/s
š Downloaded 1.13 GB
ā° Download time 10.00s
⬠Download speed (Mbps) 906.71 Mbps
⬠Download speed (MB/s) 113.34 MB/s
==== ======================= =============
§Run Command Options
$ netbeat run --help
Run a speed test against a target server
Usage: netbeat run [OPTIONS] <TARGET>
Arguments:
<TARGET> Target server IP address or hostname
Options:
-p, --port <PORT> Target port on server (1-65535) [default: 5050]
-t, --time <TIME> Time limit per test direction in seconds (1-3600) [default: 10]
-d, --data <DATA> Target size of data to be uploaded/downloaded in the speed test including units (eg, 10MB, 1GB, 2GB). Instead of time
-c, --chunk-size <CHUNK_SIZE> Buffer size for read/write operations (eg, 32KiB, 64KiB, 128KiB) [default: 64KiB]
--ping-count <PING_COUNT> Number of pings to perform for ping test (1-1000) [default: 20]
-j, --json Return results as json to stdout
--timeout <TIMEOUT> Connection timeout in seconds [default: 30]
--retries <RETRIES> Number of retry attempts on connection failure [default: 3]
-q, --quiet Suppress progress output (results & errors only)
-v, --verbose Enable verbose output
-h, --help Print help
§Starting a Server
Start server on all interfaces:
$ netbeat serve
š” Server Listening on 0.0.0.0:5050
š New connection from 10.1.1.115:60588
š Running ping test for client... ā
Completed.
š Running upload speed test for client... ā
Completed.
š Running download speed test for client... ā
Completed.
§Serve Command Options
$ netbeat serve --help
Start listening for incoming connections on a server.
Usage: netbeat serve [OPTIONS]
Options:
-i, --interface <INTERFACE> Network interface to bind server to: 'all' (0.0.0.0) or 'localhost' (127.0.0.1) [default: all]
-p, --port <PORT> Port to listen on (1-65535) [default: 5050]
-c, --chunk-size <CHUNK_SIZE> Buffer size for data transfer (eg, 32KiB, 64KiB, 128KiB) [default: 64KiB]
--connections <CONNECTIONS> Maximum concurrent connections [default: 50]
-q, --quiet Suppress all output (errors only)
-v, --verbose Enable verbose output
-h, --help Print help
§Library API
§Server Setup
use netbeat::{Server, Result, BindInterface};
fn main() -> Result<()> {
let server = Server::builder()
.interface(BindInterface::All)
.port(5050)
.max_connections(100)
.build()?;
server.listen()?;
Ok(())
}
§Basic Client Usage
use netbeat::{Client, Result, NetbeatReport};
fn main() -> Result<()> {
let client = Client::builder("10.1.1.11")
.port(5050)
.time(30)
.build()?;
let report: NetbeatReport = client.contact()?;
Ok(())
}
§Security
- Netbeat is designed for trusted networks
- Consider appropriate firewall rules when exposing the server
- Please open an issue if you find any security vulnerabilities
§Contributing
- Fork the repository
- Create a new branch for your feature or bug fix
- Make your changes and commit them
- Optionally, install pre commit hooks via
make install-hooks
- Optionally, install pre commit hooks via
- Push your changes to your fork
- Submit a pull request, using conventional commit messages as PR title
§Notice
This is my first Rust project, and Iām still learning the language. Please be patient with me and feel free to provide feedback and suggestions for improvement š Contributions are welcome!
Re-exports§
pub use core::config::BindInterface;
pub use core::Client;
pub use core::Server;
pub use output::reports::NetbeatReport;
pub use output::reports::PingReport;
pub use output::reports::SpeedReport;
pub use utils::error::NetbeatError;
pub use utils::error::Result;