in client.go [958:1005]
func runUDPBandwidthAndPpsTest(test *ethrTest) {
for th := uint32(0); th < test.clientParam.NumThreads; th++ {
go func(th uint32) {
size := test.clientParam.BufferSize
buff := make([]byte, size)
conn, err := ethrDialInc(UDP, test.dialAddr, uint16(th))
if err != nil {
ui.printDbg("Unable to dial UDP, error: %v", err)
return
}
defer conn.Close()
ec := test.newConn(conn)
rserver, rport, _ := net.SplitHostPort(conn.RemoteAddr().String())
lserver, lport, _ := net.SplitHostPort(conn.LocalAddr().String())
ui.printMsg("[%3d] local %s port %s connected to %s port %s",
ec.fd, lserver, lport, rserver, rport)
bufferLen := len(buff)
totalBytesToSend := test.clientParam.BwRate
sentBytes := uint64(0)
start, waitTime, bytesToSend := beginThrottle(totalBytesToSend, bufferLen)
ExitForLoop:
for {
select {
case <-test.done:
break ExitForLoop
default:
n, err := conn.Write(buff[:bytesToSend])
if err != nil {
ui.printDbg("%v", err)
continue
}
if n < bytesToSend {
ui.printDbg("Partial write: %d", n)
continue
}
atomic.AddUint64(&ec.bw, uint64(n))
atomic.AddUint64(&ec.pps, 1)
atomic.AddUint64(&test.testResult.bw, uint64(n))
atomic.AddUint64(&test.testResult.pps, 1)
if !test.clientParam.Reverse {
sentBytes += uint64(n)
start, waitTime, sentBytes, bytesToSend = enforceThrottle(start, waitTime, totalBytesToSend, sentBytes, bufferLen)
}
}
}
}(th)
}
}