You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
1.3 KiB
70 lines
1.3 KiB
6 years ago
|
package echo
|
||
|
|
||
|
import (
|
||
|
"encoding/binary"
|
||
|
"errors"
|
||
|
"io"
|
||
|
"net"
|
||
|
|
||
|
"github.com/gansidui/gotcp"
|
||
|
)
|
||
|
|
||
|
type EchoPacket struct {
|
||
|
buff []byte
|
||
|
}
|
||
|
|
||
|
func (this *EchoPacket) Serialize() []byte {
|
||
|
return this.buff
|
||
|
}
|
||
|
|
||
|
func (this *EchoPacket) GetLength() uint32 {
|
||
|
return binary.BigEndian.Uint32(this.buff[0:4])
|
||
|
}
|
||
|
|
||
|
func (this *EchoPacket) GetBody() []byte {
|
||
|
return this.buff[4:]
|
||
|
}
|
||
|
|
||
|
func NewEchoPacket(buff []byte, hasLengthField bool) *EchoPacket {
|
||
|
p := &EchoPacket{}
|
||
|
|
||
|
if hasLengthField {
|
||
|
p.buff = buff
|
||
|
|
||
|
} else {
|
||
|
p.buff = make([]byte, 4+len(buff))
|
||
|
binary.BigEndian.PutUint32(p.buff[0:4], uint32(len(buff)))
|
||
|
copy(p.buff[4:], buff)
|
||
|
}
|
||
|
|
||
|
return p
|
||
|
}
|
||
|
|
||
|
type EchoProtocol struct {
|
||
|
}
|
||
|
|
||
|
func (this *EchoProtocol) ReadPacket(conn *net.TCPConn) (gotcp.Packet, error) {
|
||
|
var (
|
||
|
lengthBytes []byte = make([]byte, 4)
|
||
|
length uint32
|
||
|
)
|
||
|
|
||
|
// read length
|
||
|
if _, err := io.ReadFull(conn, lengthBytes); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
if length = binary.BigEndian.Uint32(lengthBytes); length > 1024 {
|
||
|
return nil, errors.New("the size of packet is larger than the limit")
|
||
|
}
|
||
|
|
||
|
buff := make([]byte, 4+length)
|
||
|
copy(buff[0:4], lengthBytes)
|
||
|
|
||
|
// read body ( buff = lengthBytes + body )
|
||
|
if _, err := io.ReadFull(conn, buff[4:]); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return NewEchoPacket(buff, true), nil
|
||
|
}
|