Eli Fulkerson .com HomeProjectsTcping

tcping.exe - ping over a tcp connection

Download Here


tcping.exe is a console application that operates similarly to 'ping', however it works over a tcp port. Not a terribly interesting concept, but I had trouble finding a windows utility to do this that I was happy with. There are many different implementions of this floating around, written independently by different people. There are many like it, but this one is mine.

Update: tcping now also speaks http. If the '-h' flag is used, tcping will connect and attempt to download the given url over http in addition to opening the port. (Note: doesn't parse www.example.org:8080/document.html format. Use "tcping -h www.example.org/document.html 8080" instead.)

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


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.
  • Usage:

        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.
                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.
        -p      Alternate way to specify port number.  Usable with --file to specify the destination in the file, but the
                port on the command line.
                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.
                Enable colored (that is, red) output for error messages.  --color will use the Windows console API which is to say it
                will work in cmd.exe etc.  --ansi uses the Unix style ansi color codes which will work in proper terminal programs.
                If available, output the domain name rather than the IP address on each output line.  Note that we are not doing
                reverse DNS here, we only have the fqdn if the user provided it.
        -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

    Download Current Version (0.35):

    tcping.exe (win32 console application)
    tcping64.exe (console, compiled for 64 bit)
    VS2013 project. (source)

    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 2016. 0.36. Error in -p broke the original port syntax, fixed. Added a few more red --colors on error messages.

    Old versions:

    Regression testing? What's that?

    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: