Eli Fulkerson .com HomeProjectsTcping

tcping.exe - ping over a tcp connection

tcping.exe is a console application that operates similarly to 'ping', however it works over a tcp port. There are many different implementions of this floating around, written independently by different people. There are many like it, but this one is mine.

I have a tcp traceroute now too. (May 2014)

Download: Buy me a coffeeBuy me a coffee

Listing directory https://download.elifulkerson.com/files/tcping/0.39: tcping-src.zip December 30 2017 11:56:46 53133 Zip archive data, at least v2.0 to extract tcping-src.zip.asc December 30 2017 11:57:24 801 GnuPG signature tcping-src.zip.md5 December 30 2017 11:57:24 49 MD5 checksum tcping-src.zip.sha1 December 30 2017 11:57:24 57 SHA1 checksum tcping-src.zip.sha256 December 30 2017 11:57:24 81 SHA256 checksum tcping-src.zip.sha512 December 30 2017 11:57:24 145 SHA512 checksum tcping.exe December 30 2017 11:49:56 258560 PE32 executable (console) Intel 80386, for MS Windows tcping.exe.asc December 30 2017 11:53:32 801 GnuPG signature tcping.exe.md5 December 30 2017 11:53:32 45 MD5 checksum tcping.exe.sha1 December 30 2017 11:53:32 53 SHA1 checksum tcping.exe.sha256 December 30 2017 11:53:32 77 SHA256 checksum tcping.exe.sha512 December 30 2017 11:53:32 141 SHA512 checksum x64 December 30 2017 16:55:46 - directory ↩ Browse the download server


    tcping - simulate "ping" over tcp by establishing a connection to network hosts.
    Measures the time for your system to [SYN], receive the target's [SYN][ACK] and send [ACK].  Note that the travel time for
    the last ACK is not included - only the time it takes to be put on the wire a tthe sending end.

    tcping [-tdsvf46] [-i interval] [-n times] [-w interval] [-b n] [-r times][-j depth] [--tee filename] [-f] destination [port]

    tcping measures the time it takes to perform a TCP 3-way handshake (SYN, SYN/ACK, ACK) between itself and a remote host.
    The travel time of the outgoing final ACK is not included, only the (minimal) amount of time it has taken to drop it on
    the wire at the near end.  This allows the travel time of the (SYN, SYN/ACK) to approximate the travel time of the
    ICMP (request, response) equivalent.
    -4      Prefer using IPv4

    -6      Prefer using IPv6

    -t      ping continuously until stopped via control-c

    -n count
            send _count_ pings and then stop.  Default 4.
    -i interval
            Wait _interval_ seconds between pings.  Default 1.  Decimals permitted.
    -w interval
            Wait _interval_ seconds for a response.  Default 2.  Decimals permitted.

    -d      include date and time on every output line
    -f      Force sending at least one byte in addition to making the connection.

    -g count
            Give up after _count_ failed pings.
    -b type
            Enable audible beeps.
            '-b 1' will beep "on down".  If a host was up, but now its not, beep.
            '-b 2' will beep "on up".  If a host was down, but now its up, beep.
            '-b 3' will beep "on change".  If a host was one way, but now its the other, beep.
            '-b 4' will beep "always".

    -c      only show output on a changed state
    -r count
            Every _count_ pings, we will perform a new DNS lookup for the host in case it changed.

    -s      Exit immediately upon a success.        

    -v      Print version and exit.

    -j      Calculate jitter.  Jitter is defined as the difference between the last response time and the historical average.

    -js depth
            Calculate jitter, as with -j but with an optional _depth_ argument specified. If _depth_ is specified tcping will
            use the prior _depth_ values to calculate a rolling average.

    --tee _filename_
            Duplicate output to the _filename_ specified.  Windows can still not be depended upon to have a useful command line 
            environment. Don't tease me, *nix guys.

            When using --tee, append to rather than overwrite the output file.
            Treat the "destination" option as a filename.  That file becomes a source of destinations, looped through on a
            line by line basis.  Some options don't work in this mode and statistics will not be kept.

            A DNS name, an IP address, or (in "http" mode) a URL.
            Do not specify the protocol ("http://") in "http" mode.  Also do not specify server port via ":port" syntax.
            For instance:   "tcping http://www.elifulkerson.com:8080/index.html" would fail
            Use the style:  "tcping www.elifulkerson.com/index.html 8080" instead.
            A numeric TCP port, 1-65535.  If not specified, defaults to 80.

            include a header with the command line arguments and timestamp.  Header is implied if using --tee.
    -h      Use "http" mode.  In http mode we will attempt to GET the specified document and return additional values including
            the document's size, http response code, kbit/s.
    -u      In "http" mode, include the target URL on each output line.
    --post  Use POST instead of GET in http mode.
    --head  Use HEAD instead of GET in http mode.
    --get   Shorthand to invoke "http" mode for consistency's sake.

    --proxy-server _proxyserver_
            Connect to _proxyserver_ to request the url rather than the server indicated in the url itself.
    --proxy-port _port_
            Specify the numeric TCP port of the proxy server.  Defaults to 3128.
    --proxy-credentials username:password
            Specify a username:password pair which is sent as a 'Proxy-Authorization: Basic' header.

    tcping returns 0 if all pings are successful, 1 if zero pings are successful and 2 for mixed outcome.

    Please report bugs and feature requests to the author via contact information on http://www.elifulkerson.com
    tcping is available at http://www.elifulkerson.com/projects/tcping.php


C:\ tcping www.elifulkerson.com

Probing - Port is open - time=25.739ms
Probing - Port is open - time=21.842ms
Probing - Port is open - time=27.701ms
Probing - Port is open - time=27.489ms

Ping statistics for
     4 probes sent.
     4 successful, 0 failed.
Approximate trip times in milli-seconds:
     Minimum = 21.842ms, Maximum = 27.701ms, Average = 25.693ms

C:\tcping -h www.elifulkerson.com
** Requesting "" from www.elifulkerson.com:
(for various reasons, kbit/s is an approximation)

Probing - HTTP is open - time=31.288ms rcv_time=31.951 status=200 bytes=4052 kbit/s=~1014.554
Probing - HTTP is open - time=29.553ms rcv_time=30.947 status=200 bytes=4052 kbit/s=~1047.479
Probing - HTTP is open - time=29.871ms rcv_time=31.727 status=200 bytes=4052 kbit/s=~1021.728
Probing - HTTP is open - time=29.976ms rcv_time=36.002 status=200 bytes=4052 kbit/s=~900.393

Ping statistics for
     4 probes sent.
     4 successful, 0 failed.
Approximate trip times in milli-seconds:
     Minimum = 29.553ms, Maximum = 31.288ms, Average = 30.172ms


  • The code for this program is available under the GPL.
  • This utility includes public domain code from The Winsock Programmer's FAQ, which you may also be interested in.
  • v0.28 onward includes base64.cpp (Copyright (C) 2004-2008 René Nyffenegger). License is in source, tl;dr - use for anything; as-is-no-guarantees; don't remove attribution.
  • Update History:

    Feb 28 2007. Have added '-t' and '-n <count>' command line options by request.
    Jun 22 2009. Have added '-i', '-d', '-b' command line options by request.
    Aug 16 2009. Now using QueryPerformanceCounter instead of ftime for timing.
    Oct 14 2009. Returning 0 for success, 1 for failure, and 2 for mixed success and failure.
    Aug 10 2010. Added -w option, for maximum time to wait before timing out a connection.
    Aug 18 2010. Added statistics output after control-c termination by request.
    Mar 10 2011. Fix for failed connections not being closed.
    Mar 15 2011. Have added '-r x' to cause a new DNS lookup every x attempts.
    Mar 17 2011. Removed the "cerr" vs "cout" distinction, ctrl-c is now more responsive.
    Apr 29 2011. -s option contributed by Michael Bray. Credits moved to the -v output to be less cluttered.
    Jul 7 2011. '-b 3' should work now in situations where it was down to start with. Oops. Thanks to Joe Hubele.
    Dec 13 2011. Added '-o', '-f'. Merged in '-d', '-h' and 'u' from httping. Added '-p'.
    Jul 20 2012. Changed '-i' to allow floats (for instance, delay 0.1 seconds between pings). Added min/max/avg download time to summary statistics when using http mode.
    Apr 14 2013. Removed inaccurate timing function and '-o' which let you choose it.. Removed '-p' in favor of '--head' and '--post' to specify HTTP commands. Added '--tee filename' to output to a file in addition to the console. Added '-j' to display jitter (currently calculated as difference between last ping and historical average). Fixed a crash bug if incorrect command line arguments were specified.
    Apr 15 2013. Changed average behavior to only count successful connections. '-j' now has an optional argument to specify the depth of a rolling average for jitter calculations. For instance, '-j 10' will use up to the 10 previous ping results, non-inclusive with the current result. Rolling average is disabled if no depth is specified - in that case it will use the total average of the entire sesion. Corrected output buffer flushing error introduced in 0.15.
    Apr 20 2013. IPv6 and http proxy support. Added '-4', '-6', '--proxy-server', '--proxy-port'. '-w' is now specified in seconds rather than milliseconds for consistency with other arguments.
    May 29 2013. Speed optimizations
    Jul 10 2013. Fixed broken command line handling for certain --proxy arguments.
    Aug 26 2013. CPU use fix - in cases where it takes a long time to get a response, we back off and stop grinding the cpu in the interest of precision.
    Jan 20 2014. Fixed some resource leaks.
    Mar 17 2014. Added -c to only output lines if there is a state change.
    Apr 2 2014. Rephrased 'no error' to be less confusing.
    Jan 1 2015. Separated -j with and without optional argument into -j and -js to avoid command line argument parsing bug.
    Mar 18 2015. Added "--file" option. Treat the destination argument as a filename containing one destination per line. Disables some options that don't make sense or are difficult (jitter, statistics and the like don't make any sense when you are hitting different targets and it is non-trivial to retain all that data for N possible destinations with the way the loop is set up)
    Apr 7 2015. 0.25 had a crash bug when using http proxy, should be fixed now. Thanks Андрей.
    Aug 1 2015. Fixed an issue with float values for -w. Added -g X to give up after X failures. Thanks jk teng. Also, compiling under Win10/VS2015 now.
    Aug 8 2015. Added --proxy-credentials to specify a 'Proxy-Authorization: Basic' header. Thanks Dam. Using includes base64.cpp (Copyright (C) 2004-2008 René Nyffenegger) to encode the username:password pair.
    Sep 2 2015. 0.28 had some debugging lines left in, oops. Removed, thanks Андрей.
    Nov 13 2015. Version 0.30. Added --header option and fixed a http proxy mode issue - wasn't sending the host when it should have.
    Dec 14 2015. -r option should now work properly if DNS doesn't resolve on the first attempt. Thanks to Mike Westman.
    Mar 15 2016. --file option now optionally includes port numbers for each line. For example, the lines "" and " 443" should work as expected.
    Apr 25 2016. Added -S option to specify the source port.
    Jun 6 2016. Added --block option to use a blocking socket. This breaks the timeout code, but it allows finer detection of the actual cause of a blocked port. In particular, now you can see actively refused vs timeout when testing firewall rules.
    May 11 2017. Version 0.35. Added -p option to specify port (even when using --file, since the normal parsing doesn't happen when using --file). Also added --color to enredden failures if you're using cmd.exe (--ansi if you are using cygwin etc). Also added --fqdn which will output the domain name rather than the ip (if its available, it doesn't force a reverse DNS lookup). For Eitan.
    May 12 2017. 0.36. Error in -p broke the original port syntax, fixed. Added a few more red --colors on error messages.
    Nov 7 2017. 0.37. Added --append option, when used in conjuntion with "--tee _filename_" will cause _filename_ to be appended to rather than overwritten.
    Dec 28 2017. 0.38. Added summaries for min/avg/max for jitter and http jitter. Using absolute value for jitter.
    Dec 30 2017. 0.39. Fixed display issue for % loss introduced in 0.38.

    Old versions:

    Regression testing? What's that?

    Note: I am depreciating my old download location in favor of download.elifulkerson.com. New versions will be signed, hashed and compiled on a dedicated dev machine.

    v0.35 tcping.exe tcping-src.zip
    v0.34 tcping.exe tcping-src.zip
    v0.33 tcping.exe tcping-src.zip
    v0.32 tcping.exe tcping-src.zip
    v0.31 tcping.exe tcping-src.zip
    v0.30 tcping.exe tcping-src.zip
    v0.29 tcping.exe tcping-src.zip
    v0.28 tcping.exe tcping-src.zip
    v0.27 tcping.exe tcping-src.zip
    v0.26 tcping.exe tcping-src.zip
    v0.25 tcping.exe tcping-src.zip
    v0.24 tcping.exe tcping-src.zip
    v0.23 tcping.exe tcping-src.zip
    v0.22 tcping.exe tcping-src.zip
    v0.21 tcping.exe tcping-src.zip
    v0.20 tcping.exe tcping-src.zip
    v0.19 tcping.exe tcping-src.zip
    v0.18 tcping.exe tcping-src.zip
    v0.17 tcping.exe tcping-src.zip
    v0.16 tcping.exe tcping-src.zip
    v0.15 tcping.exe tcping-src.zip
    v0.14 tcping.exe tcping-src.zip
    v0.13 tcping.exe tcping-src.zip
    v0.12 tcping.exe tcping-src.zip
    v0.11 tcping.exe tcping-src.zip
    v0.10 tcping.exe tcping-src.zip
    v0.9 tcping.exe tcping-src.zip
    v0.8 tcping.exe tcping-src.zip
    v0.7 tcping.exe tcping-src.zip
    v0.6 tcping.exe tcping-src.zip
    v0.5 tcping.exe tcping-src.zip
    v0.4 tcping.exe tcping-src.zip
    v0.3 tcping.exe tcping-src.zip
    v0.2 tcping.exe tcping-src.zip
    v0.1 tcping.exe tcping-src.zip

    See also: