123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- package rpc
- import (
- "bytes"
- "encoding/binary"
- "errors"
- "io"
- )
- const (
- FuncPing uint8 = 0x01
- FuncRequest = 0x02
- FuncResponse = 0x03
- )
- var (
- feature = []byte{82, 80, 67} //RPC数据包
- errInvalidPackage = errors.New("invalid package")
- )
- type Frame struct {
- Feature []byte //特征码 RPC
- Func uint8
- Sequence uint16
- Length uint16
- Data []byte
- }
- func readFrame(r io.Reader) (frame *Frame, err error) {
- var (
- n int
- )
- frame = &Frame{Feature: make([]byte, 3)}
- if _, err = io.ReadFull(r, frame.Feature); err != nil {
- return
- }
- if !bytes.Equal(frame.Feature, feature) {
- err = errInvalidPackage
- return
- }
- 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)
- if n, err = io.ReadFull(r, frame.Data); err == nil {
- if n < int(frame.Length) {
- err = io.ErrShortBuffer
- }
- }
- return
- }
- func writeFrame(w io.Writer, frame *Frame) (err error) {
- var (
- n int
- )
- if frame.Length == 0 {
- frame.Length = uint16(len(frame.Data))
- }
- if _, err = w.Write(feature); err != nil {
- return
- }
- 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
- }
- if n, err = w.Write(frame.Data); err == nil {
- if n < int(frame.Length) {
- err = io.ErrShortWrite
- }
- }
- return
- }
|