修订udp代码; dial配置 添加 fullcone 选项;默认为非fullcone

现在整个程序均通过了go test, main 也可以正常运行了。

Relay_UDP 函数添加流量计数;

发现之前 Relay函数的流量计数 在main.go里参数传反了,导致实际上计数的是上传而不是下载,已修复

对fullcone的情况做了特别考量。MsgConn的 Close函数在fullcone时不能随便被调用。

因此我添加了一个 CloseConnWithRaddr(raddr Addr) error  方法,以及 Fullcone() bool     方法

在utils包的init部分使用 rand 随机种子
This commit is contained in:
hahahrfool
2022-04-08 20:31:59 +08:00
parent 447bd8749a
commit ce735dbb99
17 changed files with 871 additions and 566 deletions

View File

@@ -97,41 +97,7 @@ func IsStrUDP_network(s string) bool {
return false
}
//使用Addr是因为有可能申请的是域名而不是ip
type MsgConn interface {
ReadFrom() ([]byte, Addr, error)
WriteTo([]byte, Addr) error
}
type UDPMsgConnWrapper struct {
*net.UDPConn
IsClient bool
FirstAddr Addr
}
func (u *UDPMsgConnWrapper) ReadFrom() ([]byte, Addr, error) {
bs := utils.GetPacket()
n, ad, err := u.UDPConn.ReadFromUDP(bs)
if err != nil {
return nil, Addr{}, err
}
return bs[:n], NewAddrFromUDPAddr(ad), err
}
func (u *UDPMsgConnWrapper) WriteTo(bs []byte, ad Addr) error {
if u.IsClient {
if ad.GetHashable() == u.FirstAddr.GetHashable() {
_, err := u.UDPConn.Write(bs)
return err
} else {
return utils.ErrNotImplemented
}
} else {
_, err := u.UDPConn.WriteTo(bs, ad.ToUDPAddr())
return err
}
type UDPAddrData struct {
Addr net.UDPAddr
Data []byte
}