func()

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
}