Compare commits

..

2 Commits

Author SHA1 Message Date
Peter J. Holzer dbf10affb4 Add option --relative 2020-12-20 15:37:30 +01:00
Peter J. Holzer 3d9133f93f Reassemble partial packets on the client
The sender's network stack assembles tcp packets without regard for
write boundaries, so the receiver has to be prepared for partial reads.
2020-12-20 15:23:59 +01:00
1 changed files with 19 additions and 9 deletions

View File

@ -2,8 +2,8 @@ package main
import ( import (
"encoding/binary" "encoding/binary"
"gopkg.in/alecthomas/kingpin.v2"
"fmt" "fmt"
"gopkg.in/alecthomas/kingpin.v2"
"log" "log"
"net" "net"
"os" "os"
@ -16,8 +16,9 @@ var (
server = app.Command("server", "Run as server") server = app.Command("server", "Run as server")
listenAddress = server.Arg("address", "Address:port to listen on").String() listenAddress = server.Arg("address", "Address:port to listen on").String()
client = app.Command("client", "Request measurement") client = app.Command("client", "Request measurement")
serverAddress = client.Arg("address", "Address:port to connect to").String() serverAddress = client.Arg("address", "Address:port to connect to").String()
relativeTimes = client.Flag("relative", "Print times relative to start").Bool()
) )
func tcpdelayServer() { func tcpdelayServer() {
@ -56,6 +57,7 @@ func tcpdelayServer() {
} }
func tcpdelayClient() { func tcpdelayClient() {
t0 := time.Now().UnixNano()
conn, err := net.Dial("tcp", *serverAddress) conn, err := net.Dial("tcp", *serverAddress)
if err != nil { if err != nil {
log.Fatal("Cannot connect to ", *serverAddress, err) log.Fatal("Cannot connect to ", *serverAddress, err)
@ -63,12 +65,16 @@ func tcpdelayClient() {
o := 0 o := 0
buffer := make([]byte, 1024) buffer := make([]byte, 1024)
for { for {
n, err := conn.Read(buffer) n := 0
if err != nil { for n < len(buffer) {
log.Fatal("Cannot read from ", *serverAddress, err) nr, err := conn.Read(buffer[n:])
} if err != nil {
if n != len(buffer) { log.Fatal("Cannot read from ", *serverAddress, err.Error())
log.Fatal("Read ", n, " bytes intead of ", len(buffer)) }
if nr <= 0 {
log.Fatal("Read ", n, " bytes intead of ", len(buffer))
}
n += nr
} }
tr := time.Now().UnixNano() tr := time.Now().UnixNano()
if string(buffer[0:8]) != "tcpdelay" { if string(buffer[0:8]) != "tcpdelay" {
@ -79,7 +85,11 @@ func tcpdelayClient() {
log.Fatal("Unexpected offset ", oSent, " instead of ", o) log.Fatal("Unexpected offset ", oSent, " instead of ", o)
} }
ts := binary.BigEndian.Uint64(buffer[16:]) ts := binary.BigEndian.Uint64(buffer[16:])
fmt.Println(o, ts, tr) // XXX - buffer for performance if *relativeTimes {
fmt.Println(o, int64(ts)-t0, tr-t0)
} else {
fmt.Println(o, ts, tr)
}
o += n o += n
} }