private async Task <TimeSpan> PingAsync(INetworkStream stream, CancellationToken cancellationToken) { var buffer = new byte[PingSize]; using (var rng = RandomNumberGenerator.Create()) { rng.GetNonZeroBytes(buffer); } var sw = new Stopwatch(); sw.Start(); if (await stream.WriteAsync(buffer, 0, buffer.Length, cancellationToken) != buffer.Length) { return(TimeSpan.Zero); } var rbuf = new byte[PingSize]; if (await stream.ReadFullAsync(rbuf, cancellationToken: cancellationToken) != rbuf.Length) { return(TimeSpan.Zero); } if (!rbuf.SequenceEqual(buffer)) { return(TimeSpan.Zero); } sw.Stop(); return(sw.Elapsed); }