-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathclient_datagram.go
87 lines (83 loc) · 1.79 KB
/
client_datagram.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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package socks5
import "log"
func NewDatagramFromBytes(bb []byte) (*DatagramC, error) {
n := len(bb)
minl := 4
if n < minl {
return nil, ErrBadRequest
}
var addr []byte
if bb[3] == ATYPIPv4 {
minl += 4
if n < minl {
return nil, ErrBadRequest
}
addr = bb[minl-4 : minl]
} else if bb[3] == ATYPIPv6 {
minl += 16
if n < minl {
return nil, ErrBadRequest
}
addr = bb[minl-16 : minl]
} else if bb[3] == ATYPDomain {
minl += 1
if n < minl {
return nil, ErrBadRequest
}
l := bb[4]
if l == 0 {
return nil, ErrBadRequest
}
minl += int(l)
if n < minl {
return nil, ErrBadRequest
}
addr = bb[minl-int(l) : minl]
addr = append([]byte{l}, addr...)
} else {
return nil, ErrBadRequest
}
minl += 2
if n <= minl {
return nil, ErrBadRequest
}
port := bb[minl-2 : minl]
data := bb[minl:]
d := &DatagramC{
Rsv: bb[0:2],
Frag: bb[2],
Atyp: bb[3],
DstAddr: addr,
DstPort: port,
Data: data,
}
if Debug {
log.Printf("Got Datagram. data: %#v %#v %#v %#v %#v %#v datagram address: %#v\n", d.Rsv, d.Frag, d.Atyp, d.DstAddr, d.DstPort, d.Data, d.Address())
}
return d, nil
}
// NewDatagram return datagram packet can be writed into client, dstaddr should not have domain length
func NewDatagramC(atyp byte, dstaddr []byte, dstport []byte, data []byte) *DatagramC {
if atyp == ATYPDomain {
dstaddr = append([]byte{byte(len(dstaddr))}, dstaddr...)
}
return &DatagramC{
Rsv: []byte{0x00, 0x00},
Frag: 0x00,
Atyp: atyp,
DstAddr: dstaddr,
DstPort: dstport,
Data: data,
}
}
// Bytes return []byte
func (d *DatagramC) Bytes() []byte {
b := make([]byte, 0)
b = append(b, d.Rsv...)
b = append(b, d.Frag)
b = append(b, d.Atyp)
b = append(b, d.DstAddr...)
b = append(b, d.DstPort...)
b = append(b, d.Data...)
return b
}