in V:
// goroutine 1: generate ticks at precise intervals
for {
select {
_ := <-cancel {break}
ms * time.millisecond {tickch <- 1}
}
}
}
// goroutine 2: send icmp echo requests
mut pk := [u8(8),0,0,0,0,0,0,1,0,0,0,0,0,0,0,0]
for {
select {
_ := <-cancel {break}
_ := <-tickch {
pk[2] = 0; pk[3] = 0; // clear checksum
t := time.sys_mono_now()
bin.big_endian_put_u64_at(mut pk, t, 8)
bin.big_endian_put_u16_at(mut pk, cksum(pk), 2)
s.write_to(a, pk)!
}
}
}
// goroutine 3: receive icmp echo replies
for {
select {
_ := <-cancel {break}
else {}
}
s.wait_for_read() or {eprintln("timed out"); continue}
t := time.sys_mono_now()
n, _ := s.read(mut &buf)!
hdrlen := 4*(buf[0]&0x0f)
printch <- Reply{bin.big_endian_u64_at(buf, hdrlen+8), t}
}
// main: print replies as they come in
for {
select {
_ := <-cancel {break}
s := <-printch {
// etc
}
}
}