diff --git a/fastping.go b/fastping.go index 5ba99e0..48a42d7 100644 --- a/fastping.go +++ b/fastping.go @@ -47,6 +47,15 @@ import ( "time" ) +func byteSliceOfSize(n int) []byte { + b := make([]byte, n) + for i := 0; i < len(b); i++ { + b[i] = 1 + } + + return b +} + func timeToBytes(t time.Time) []byte { nsec := t.UnixNano() b := make([]byte, 8) @@ -100,6 +109,9 @@ type Pinger struct { hasIPv6 bool ctx *context mu sync.Mutex + + // Size in bytes of the payload to send + Size int // Number of (nano,milli)seconds of an idle timeout. Once it passed, // the library calls an idle callback function. It is also used for an // interval time of RunLoop() method @@ -122,6 +134,7 @@ func NewPinger() *Pinger { addrs: make(map[string]*net.IPAddr), hasIPv4: false, hasIPv6: false, + Size: 64, MaxRTT: time.Second, OnRecv: nil, OnIdle: nil, @@ -389,12 +402,14 @@ func (p *Pinger) sendICMP(conn, conn6 *net.IPConn) (map[string]*net.IPAddr, erro continue } + t := timeToBytes(time.Now()) + p.mu.Lock() bytes, err := (&icmpMessage{ Type: typ, Code: 0, Body: &icmpEcho{ ID: p.id, Seq: p.seq, - Data: timeToBytes(time.Now()), + Data: append(t, byteSliceOfSize(p.Size-len(t))...), }, }).Marshal() p.mu.Unlock() @@ -500,7 +515,7 @@ func (p *Pinger) procRecv(recv *packet, queue map[string]*net.IPAddr) { case *icmpEcho: p.mu.Lock() if pkt.ID == p.id && pkt.Seq == p.seq { - rtt = time.Since(bytesToTime(pkt.Data)) + rtt = time.Since(bytesToTime(pkt.Data[:8])) } p.mu.Unlock() default: