PingDD is a cross-platform network reachability and diagnostics tool written in C that measures TCP/UDP/ICMP reachability. Where classic ping only answers "is the host up over ICMP," PingDD checks whether the service port is actually open over TCP, UDP, or ICMP, measures handshake latency to microsecond precision, and falls through IPv4/IPv6 addresses automatically. It probes many hosts, ports, protocols at once (sequentially or concurrently), reports min/max/avg, stddev and p50/p95/p99 percentiles, and runs live network-quality diagnostics: downtime, packet loss, jitter, latency spikes, bufferbloat, DNS timing distilled to a one-word HEALTHY/DEGRADED/DOWN verdict. Operator modes add continuous availability monitoring, load testing, and a resilience sweep. Output is human-colored, NDJSON, or CSV for keeping evidence across runs.
It began as a TCP "ping," which is where the name comes from. It now does considerably more than ping.
Classic ping answers exactly one question: can I reach this host over ICMP? In real troubleshooting, that is almost never the question you actually have. The real questions are:
- Is the service port open at all: 80, 443, 22, 3389, whatever you care about?
- Is the path slow because of latency, filtering, or a sluggish handshake?
- Is the quality bad: jitter, loss, spikes, bufferbloat, slow DNS?
- Was the service down ten minutes ago, and can I prove it afterward?
ICMP answers none of those. A host can happily reply to pings while the service behind it is dead, and plenty of hosts drop ICMP entirely while serving traffic just fine. So PingDD checks the thing you actually care about: the port. It measures how long the connection takes, scores the quality of the path, watches over time, and keeps the evidence in JSON or CSV so you can prove what happened after the fact.
- TCP and UDP port checks (connect-based for TCP, datagram-based for UDP).
- ICMP echo mode (classic ping) over IPv4 and IPv6.
- Connect time (RTT) in milliseconds, measured with microsecond precision.
- IPv4 and IPv6, resolved automatically from A and AAAA records. If the first address is unreachable, it falls through to the next.
- Multi-target probing: many hosts × ports (lists and ranges) × protocols, run sequentially or concurrently.
- Source-interface selection: bind probes to a specific NIC or IP, so you can compare wifi against ethernet against a VPN on the same target.
- Summary statistics: min/max/average, standard deviation, and p50/p95/p99 percentiles.
- Network-quality diagnostics: downtime detection, packet loss, jitter, latency spikes, a bufferbloat estimate, DNS timing, and a one-word verdict of
HEALTHY,DEGRADED, orDOWN. - Three operator modes: availability monitoring, load testing, and a resilience sweep.
- Machine-readable JSON output to the terminal (
--json), or logged to an auto-named file (--json-file) or CSV (--csv) for long runs. - Colored output that turns itself off when piped, and honors
NO_COLOR.
Install with Winget. It drops PingDD on your PATH automatically.
winget install -e --id DarthDemono.PingDDGrab the latest binary from the Releases page:
https://github.com/darthdemono/PingDD/releases
If your distro is not in the release list, build it yourself. The only hard dependency is a C compiler and make.
git clone https://github.com/darthdemono/PingDD.git
cd PingDD
make clean
makeThen put the binary on your PATH:
pingdd <host> [host ...] -p <port[,list,a-b]> [options]| Option | Description | Required | Default |
|---|---|---|---|
<host> ... |
One or more target hostnames/IPs (IPv4 or IPv6) | Yes* | - |
-p, --port P |
Port, comma list, or range (e.g. 80,443,8000-8010) |
TCP/UDP | - |
-P, --protocol P |
Protocol list: TCP, UDP, ICMP (comma-separated) |
No | TCP |
-I, --interface X |
Bind probes to a source IP or interface name | No | default route |
--target SPEC |
Add a host:port/proto target (repeatable) |
No | - |
--targets FILE |
Read targets from a file, one per line | No | - |
--concurrent |
Probe every target in parallel each cycle | No | sequential |
-t, --timeout N |
Per-probe timeout in milliseconds | No | 1000 |
-c, --count N |
Number of checks | No | infinite |
-r, --rate N |
Delay between checks, in milliseconds | No | 50 |
-w, --deadline N |
Stop after N milliseconds total | No | none |
-q, --quiet |
Suppress per-probe lines, print the summary only | No | off |
-a, --audible |
Ring the terminal bell on each success | No | off |
--json |
Emit machine-readable JSON (implies no color) | No | off |
--csv |
Log every attempt to a CSV file | No | off |
--color |
Force colored output | No | auto (TTY) |
--no-color |
Disable colored output | No | auto (TTY) |
-V, --version |
Print the version | No | - |
-?, --help |
Print help | No | - |
* You need a destination, but it does not have to be a positional host. --target or --targets works too. Give it several hosts, a port list or range, and a protocol list, and PingDD expands the combination into a full host × port × protocol matrix. ICMP targets ignore the port. Every target keeps its own statistics and diagnostics, and you get a combined roll-up at the end.
Color is automatic: on when output is a terminal, off when it is piped or when the NO_COLOR environment variable is set.
ICMP mode uses no port, so -p is optional there. ICMP may need elevated privileges (CAP_NET_RAW) on systems that do not allow unprivileged ICMP datagram sockets.
PingDD does not just count drops; it tries to tell you whether a drop means anything.
A single failed probe surrounded by successes is noise. A network has bad seconds. So PingDD only calls a target DOWN after several consecutive failures, and it tracks how long the outage lasted and how many times it happened. One lost packet is not an outage. Three in a row is.
The summary grades the link from loss, jitter, and latency, estimates bufferbloat from how far the slow probes drift above the baseline, and times the DNS lookup separately so a slow resolver does not get blamed on the network. The result is a one-word verdict, HEALTHY, DEGRADED, or DOWN, plus the numbers behind it. With --monitor it also prints an availability percentage.
PingDD has three modes aimed at operators rather than one-off checks.
| Mode | Flag | What it does |
|---|---|---|
| Availability | --monitor |
Probes continuously, raises outage and recovery alerts, reports uptime. |
| Load test | --load-test |
Opens sustained concurrent connections to measure behavior under load. |
| Resilience | --resilience |
Ramps concurrency in steps and reports where the service starts to degrade. |
Load-test and resilience take --concurrency N (1–256) and --duration N (seconds, 1–3600).
A word on what PingDD is not. It is not a DoS tool, and it will not become one. There is no packet flooding, no amplification, no reflection, no spoofing, and no filter bypass. None of it, by design. Load testing exists to measure your own service under pressure, nothing else. Concurrency is capped at 256 and duration at one hour. Use it on systems you own or have written permission to test. The rest is on you.
# Watch a service and report availability:
pingdd 192.168.1.10 -p 443 --monitor
# Load test your own service (loopback or private), 50 connections for 30s:
pingdd 127.0.0.1 -p 8080 --load-test --concurrency 50 --duration 30
# Find the concurrency at which your service starts to degrade:
pingdd 10.0.0.5 -p 80 --resilience --concurrency 128 --duration 60Check port 80 a hundred times:
pingdd example.com -p 80 -c 100Slow it down to one check every 500 milliseconds:
pingdd example.com -p 443 -r 500Log every attempt to CSV:
pingdd example.com -p 443 --csvProbe two hosts across a port range and two protocols at once:
pingdd 1.1.1.1 8.8.8.8 -p 53,443,8000-8005 -P TCP,UDPCompare the same target over wifi and ethernet by binding the source interface:
pingdd 1.1.1.1 -p 443 -I wlan0
pingdd 1.1.1.1 -p 443 -I eth0Probe explicit targets in parallel, or read them from a file:
pingdd --target 1.1.1.1:443/tcp --target 8.8.8.8:53/udp --concurrent
pingdd --targets hosts.txt --monitorWith --csv, PingDD writes a timestamped file and records one row per successful probe:
- DateTime
- Host
- IPAddress
- Protocol
- Port
- Time_ms
IPAddress is the address actually probed, not just the first one resolved, so when fail-over picks a different address the log shows the truth. Feed the file to whatever you graph with, compare it against another network, or keep it as a record for the next time someone insists the service "was never down."
By default the output is colored and human-readable. Two alternatives exist for everything else:
--csvkeeps a row per success, as above.--jsonprints one JSON object per probe plus a summary and a diagnostics object, with color disabled. It is line-delimited, so you can pipe it straight intojqor anything that reads NDJSON.
The makefile targets Windows (x86 and ARM64) and Linux (x86_64, ARM, ARM64).
make # auto-detect the host
make win32 # Windows x86 -> bin/win-x86/pingdd.exe
make winarm64 # Windows ARM64 -> bin/win-arm64/pingdd.exe
make linux # Linux native -> bin/linux/pingdd
make linuxarm # Linux ARM 32-bit -> bin/linux-arm/pingdd
make linuxarm64 # Linux ARM64 -> bin/linux-arm64/pingddCross-compiling needs the matching toolchain (i686-w64-mingw32-gcc for Windows, aarch64-linux-gnu-gcc for Linux ARM64, and so on). The Windows targets also need a resource compiler; the makefile finds windres on its own, whether it is the plain windres from MSYS2 or the cross-prefixed one from a Linux mingw package.
PingDD keeps the code straightforward and readable. It prefers predictable behavior, clean output, and portability over clever tricks. Changes that improve reliability and cross-platform correctness win over changes that just look smart.
"An idiot admires complexity, a genius admires simplicity" — Terry A. Davis
Contributions are welcome.
- Open an issue for bugs, feature requests, or suggestions.
- Send a pull request if you want to improve the code, the portability, the documentation, or the CI packaging.
MIT License. See LICENSE.
