package shadow import ( "bytes" "encoding/binary" "fmt" "net" ) var ( AppDataHeader = []byte{0x17, 0x3, 0x3} ) type PackAppData struct { Conn net.Conn } func (m PackAppData) Read(p []byte) (n int, err error) { buf := make([]byte, 32*1024) read, err := m.Conn.Read(buf[0:5]) if bytes.Equal(buf[0:3], AppDataHeader) { u := int(binary.BigEndian.Uint16(buf[3:5])) r, err := m.Conn.Read(buf[5 : u+5]) copy(p, buf[5:r+5]) return r, err } else { fmt.Println("Header is not present") return read, err } } func (m PackAppData) Write(p []byte) (n int, err error) { t := make([]byte, len(p)+5) copy(t[0:], AppDataHeader) binary.BigEndian.PutUint16(t[3:], uint16(len(p))) copy(t[5:], p) write, err := m.Conn.Write(t) write = write - 5 return write, err } func (m PackAppData) Close() error { return m.Conn.Close() }