package shadow import ( "bytes" "encoding/binary" "errors" "fmt" "io" "net" ) var ( AppDataHeader = []byte{0x17, 0x3, 0x3} HeaderLength = len(AppDataHeader) ) type PackAppData struct { Conn net.Conn } func (m PackAppData) Read(p []byte) (n int, err error) { buf := make([]byte, 32*1024+HeaderLength+2) headRead, err := io.ReadAtLeast(m.Conn, buf[0:HeaderLength+2], HeaderLength+2) if err != nil { if err != io.EOF { fmt.Printf("Read header error: %v\n", err) } return 0, err } if headRead < HeaderLength+2 { return 0, errors.New("Read header failed") } if bytes.Equal(buf[0:HeaderLength], AppDataHeader) { payLoadLength := int(binary.BigEndian.Uint16(buf[HeaderLength : HeaderLength+2])) sum := 0 for sum < payLoadLength { r, e := m.Conn.Read(buf[HeaderLength+2+sum : HeaderLength+2+payLoadLength]) if e != nil { if e == io.EOF { break } else { return 0, e } } copy(p[sum:], buf[HeaderLength+2+sum:HeaderLength+2+sum+r]) sum += r } return sum, err } else { fmt.Printf("Invalid header") return 0, errors.New("invalid header") } } func (m PackAppData) Write(p []byte) (n int, err error) { lenNum := make([]byte, 2) binary.BigEndian.PutUint16(lenNum, uint16(len(p))) packetBuf := bytes.NewBuffer(AppDataHeader) packetBuf.Write(lenNum) packetBuf.Write(p) write, err := m.Conn.Write(packetBuf.Bytes()) write = write - HeaderLength - 2 return write, err } func (m PackAppData) Close() error { return m.Conn.Close() }