in ntp/control/client.go [36:82]
func (n *NTPClient) CommunicateWithData(packet *NTPControlMsgHead, data []uint8) (*NTPControlMsg, error) {
packet.Sequence = n.Sequence
if len(data) > 0 {
packet.Count = uint16(len(data))
}
n.Sequence++
// create a buffer where we can compose full payload
buf := new(bytes.Buffer)
err := binary.Write(buf, binary.BigEndian, packet)
if err != nil {
return nil, err
}
err = binary.Write(buf, binary.BigEndian, data)
if err != nil {
return nil, err
}
// send full payload
_, err = n.Connection.Write(buf.Bytes())
if err != nil {
return nil, err
}
var resultHead *NTPControlMsgHead
resultData := make([]uint8, 0)
// read packets till More flag is not set
for {
response := make([]uint8, 1024)
head := new(NTPControlMsgHead)
read, err := n.Connection.Read(response)
if err != nil {
return nil, err
}
log.Debugf("Read %d bytes", read)
r := bytes.NewReader(response[:12])
if err = binary.Read(r, binary.BigEndian, head); err != nil {
return nil, err
}
log.Debugf("Data offset: %d, count: %d", head.Offset, head.Count)
data := make([]uint8, head.Count)
copy(data, response[12:12+head.Count])
resultData = append(resultData, data...)
if !head.HasMore() {
resultHead = head
break
}
}
return &NTPControlMsg{NTPControlMsgHead: *resultHead, Data: resultData}, nil
}