Skip to content

A fast, minimal, & lightweight tool for testing network upload and download speeds between a client and server, written purely in Rust.

License

Notifications You must be signed in to change notification settings

jakepenzak/netbeat

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

11 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Neatbeat Logo

Crates.io Version Rust CI codecov

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.

Neatbeat Demo

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

Cargo (cross-platform)

Requires Rust toolchain.

Binary Crate (CLI)

cargo install netbeat

Library Crate

cargo add netbeat

Pre-build Binaries

Available via Github Releases

Availabe builds:

  • Linux - x86_64-unknown-linux-gnu, x86_64-unknown-linux-musl, aarch64-unknown-linux-gnu, & aarch64-unknown-linux-musl
  • MacOS - x86_64-apple-darwin and aarch64-apple-darwin
  • Windows - x86_64-pc-windows-gnu

Quick Start

  1. Install: cargo install netbeat
  2. Start a server: netbeat serve
  3. 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

  1. Fork the repository
  2. Create a new branch for your feature or bug fix
  3. Make your changes and commit them
    • Optionally, install pre commit hooks via make install-hooks
  4. Push your changes to your fork
  5. 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!

About

A fast, minimal, & lightweight tool for testing network upload and download speeds between a client and server, written purely in Rust.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 2

  •  
  •