in client.go [297:354]
func runTCPLatencyTest(test *ethrTest, g time.Duration, toStop chan int) {
ui.printMsg("Running latency test: %v, %v", test.clientParam.RttCount, test.clientParam.BufferSize)
conn, err := ethrDial(TCP, test.dialAddr)
if err != nil {
ui.printErr("Error dialing the latency connection: %v", err)
return
}
defer conn.Close()
err = handshakeWithServer(test, conn)
if err != nil {
ui.printErr("Failed in handshake with the server. Error: %v", err)
return
}
ui.emitLatencyHdr()
buffSize := test.clientParam.BufferSize
buff := make([]byte, buffSize)
for i := uint32(0); i < buffSize; i++ {
buff[i] = byte(i)
}
blen := len(buff)
rttCount := test.clientParam.RttCount
latencyNumbers := make([]time.Duration, rttCount)
ExitForLoop:
for {
ExitSelect:
select {
case <-test.done:
break ExitForLoop
default:
t0 := time.Now()
for i := uint32(0); i < rttCount; i++ {
s1 := time.Now()
n, err := conn.Write(buff)
if err != nil || n < blen {
ui.printDbg("Error sending/receiving data on a connection for latency test: %v", err)
toStop <- disconnect
break ExitSelect
}
_, err = io.ReadFull(conn, buff)
if err != nil {
ui.printDbg("Error sending/receiving data on a connection for latency test: %v", err)
toStop <- disconnect
break ExitSelect
}
e2 := time.Since(s1)
latencyNumbers[i] = e2
}
// TODO temp code, fix it better, this is to allow server to do
// server side latency measurements as well.
_, _ = conn.Write(buff)
calcAndPrintLatency(test, rttCount, latencyNumbers)
t1 := time.Since(t0)
if t1 < g {
time.Sleep(g - t1)
}
}
}
}