-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstun.go
68 lines (55 loc) · 1.86 KB
/
stun.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
package stun
/*
* NAT判断和NAT穿透任务完全解耦
*/
import (
"errors"
"net"
"stun/config"
"github.com/lysShub/mapdb"
)
// 无论客户端还是服务器都需要两个IP(IP1和IP2)。同一个VPS绑定两张网卡;这两张网卡的私网IP分别是a、b,公网IP分别是x,y。则在客户端IP1、IP2分别配置为x、y,在服务器IP1、IP2分别配置为a、b。
type STUN struct {
// ResendTimes int // 同数据包重复发送次数,确保UDP可靠,默认5
// MatchTime time.Duration // 匹配时长
// TimeOut time.Duration // 超时时间
// ExtPorts int // 泛端口范围,默认7
Port int // 端口,使用多个端口则依次递增
}
// Send 回复, 如果raddr!=nil将会使用conn.WriteToUDP
func (s *STUN) Send(conn *net.UDPConn, da []byte, raddr *net.UDPAddr) error {
for i := 0; i < config.ResendTimes; i++ {
if raddr != nil {
if _, err := conn.WriteToUDP(da, raddr); err != nil {
return err
}
} else {
if _, err := conn.Write(da); err != nil {
return err
}
}
}
return nil
}
var err error
var errSever error = errors.New("sever no reply or network timeout")
// sever Sever Conn
type sever struct {
STUN
s1, s2 int // 端口
lip1, lip2 net.IP // 内网第一IP, 内网第二IP
wip2 net.IP // 内网第二IP(第二网卡)对应的公网IP
conn1 *net.UDPConn // 第一IP: 第一端口
conn2 *net.UDPConn // 第一IP: 第二端口
conn3 *net.UDPConn // 第二IP: 第一端口
dbj *mapdb.Db // NAT类型判断的数据库
dbt *mapdb.Db // NAT穿隧数据库
}
// client Client Conn
type client struct {
STUN
sever net.IP // 服务器IP
cp1, cp2 int // 本地(客户端)使用端口, client port
flag []byte
raddr *net.UDPAddr // 对方地址
}