/
packet.go
67 lines (55 loc) · 1.23 KB
/
packet.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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package netest
import (
"bufio"
"bytes"
"encoding/binary"
"fmt"
"io"
)
var MTU = 1500
type PacketHeader struct {
Length uint16
Sequence uint16
}
type Packet struct {
PacketHeader
Payload []byte
}
func decodePacket(reader io.Reader) (*Packet, error) {
b := make([]byte, MTU)
p := new(Packet)
length, err := reader.Read(b)
if err == nil {
buffer := bytes.NewBuffer(b[0:length])
h := new(PacketHeader)
binary.Read(buffer, binary.BigEndian, h)
p.PacketHeader = *h
if int(h.Length) > length {
return p, fmt.Errorf("Packet Header reports length %d which is larger than the buffer size of %d", h.Length, len(b))
}
if h.Length-4 > 0 {
p.Payload = b[4:h.Length]
} else {
p.Payload = make([]byte, 0)
}
}
return p, err
}
func encodePacket(writer *bufio.Writer, sequence uint16, payload []byte) (int, error) {
var length int
if len(payload) > MTU {
return 0, fmt.Errorf("payload cannot be greater than %d bytes", MTU)
}
h := new(PacketHeader)
h.Length = uint16(len(payload) + binary.Size(h))
h.Sequence = sequence
err := binary.Write(writer, binary.BigEndian, h)
if err == nil {
_, err = writer.Write(payload)
}
if err == nil {
length = writer.Buffered()
err = writer.Flush()
}
return length, err
}