package rpc import ( "encoding/binary" "io" ) const ( FuncPing uint8 = 0x01 FuncRequest = 0x02 FuncResponse = 0x03 ) type Frame struct { Func uint8 Sequence uint16 Length uint16 Data []byte } func readFrame(r io.Reader) (frame *Frame, err error) { frame = &Frame{} if err = binary.Read(r, binary.LittleEndian, &frame.Func); err != nil { return } if err = binary.Read(r, binary.LittleEndian, &frame.Sequence); err != nil { return } if err = binary.Read(r, binary.LittleEndian, &frame.Length); err != nil { return } frame.Data = make([]byte, frame.Length) _, err = io.ReadFull(r, frame.Data) return } func writeFrame(w io.Writer, frame *Frame) (err error) { if frame.Length == 0 { frame.Length = uint16(len(frame.Data)) } if err = binary.Write(w, binary.LittleEndian, frame.Func); err != nil { return } if err = binary.Write(w, binary.LittleEndian, frame.Sequence); err != nil { return } if err = binary.Write(w, binary.LittleEndian, frame.Length); err != nil { return } _, err = w.Write(frame.Data) return }