Unless you want to implement a server in your client (which is likely to have the same issues as ping and traceroute), what I have found effective is to have a thread (or separate task) in the client that downloads a file, computes the download time / download size and reports that back to the server. True, that measures a combination of link speed and latency, but it is a good quick and dirty indication of how good or bad the link is. You need to do it a few times to get a somewhat meaningful picture of performance and do it occasionally over time in case the route or link changes.