-
Notifications
You must be signed in to change notification settings - Fork 0
/
netpackager.go
41 lines (34 loc) · 1.34 KB
/
netpackager.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package gonet
import "encoding/binary"
//++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ + + +
//+ 消息总长度(2) + 消息ID(4) + 消息内容 +
//+ + + +
//++++++++++++++++++++++++++++++++++++++++++++++++++++++
const (
MTU = 1500 // 最大传输单元
PktSizeOffset = 2 // 包体大小字段
MsgIDOffset = 4 // 消息ID字段
HeaderOffset = MsgIDOffset + MsgIDOffset //包头部分
)
// 网络包解析器(network package)
type INetPackager interface {
Package(s ISession, msgID uint32, v any) ([]byte, error)
UnPackage(s ISession, data []byte) (IMessage, int, error)
}
type DefaultNetPackager struct {
}
func (d *DefaultNetPackager) Package(s ISession, msgID uint32, v any) ([]byte, error) {
body, err := s.GetContext().Marshal(v)
if err != nil {
return nil, err
}
content := make([]byte, MsgIDOffset+len(body))
binary.LittleEndian.PutUint32(content, msgID)
copy(content[MsgIDOffset:], body)
return content, nil
}
func (d *DefaultNetPackager) UnPackage(s ISession, data []byte) (IMessage, int, error) {
msgID := binary.LittleEndian.Uint32(data[:MsgIDOffset])
return &message{id: msgID, body: data[MsgIDOffset:], session: s}, 0, nil
}