修订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

@@ -19,21 +19,20 @@ func init() {
//实现了 proxy.Client, netLayer.UDP_Putter_Generator
type Client struct {
proxy.ProxyCommonStruct
isfullcone bool
}
type ClientCreator struct{}
func NewClient() (proxy.Client, error) {
func (_ ClientCreator) NewClientFromURL(*url.URL) (proxy.Client, error) {
d := &Client{}
return d, nil
}
func (_ ClientCreator) NewClientFromURL(*url.URL) (proxy.Client, error) {
return NewClient()
}
func (_ ClientCreator) NewClient(*proxy.DialConf) (proxy.Client, error) {
return NewClient()
func (_ ClientCreator) NewClient(dc *proxy.DialConf) (proxy.Client, error) {
d := &Client{}
d.isfullcone = dc.Fullcone
return d, nil
}
func (d *Client) Name() string { return name }
@@ -49,8 +48,8 @@ func (d *Client) Handshake(underlay net.Conn, target netLayer.Addr) (io.ReadWrit
}
//direct的Client的 EstablishUDPChannel 实际上就是直接拨号udp
//direct的Client的 EstablishUDPChannel 实际上就是直接 监听一个udp端口。
func (d *Client) EstablishUDPChannel(_ net.Conn, target netLayer.Addr) (netLayer.MsgConn, error) {
conn, err := net.DialUDP("udp", nil, target.ToUDPAddr())
return &netLayer.UDPMsgConnWrapper{UDPConn: conn, IsClient: true, FirstAddr: target}, err
return netLayer.NewUDPMsgConnClientWrapper(nil, d.isfullcone, false), nil
}