Files
v2ray_simple/netLayer/dial.go
e1732a364fed cc758dec66 全面修订代码;完成 grpcSimple包;使用 tag选择编译quic 和 grpc
grpcSimple包的服务端和客户端现在都已完成,且兼容v2ray等内核。
grpcSimple包 简洁、高效,更加科学。暂不支持multiMode。

若 grpc_full 给出,则使用grpc包,否则默认使用 grpcSimple包。
若 noquic给出,则不使用 quic,否则 默认使用 quic。

修复 ws early 失效问题;
2022-04-28 05:41:56 +08:00

102 lines
1.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package netLayer
import (
"crypto/tls"
"net"
"syscall"
"time"
)
func (addr *Addr) Dial() (net.Conn, error) {
var istls bool
var resultConn net.Conn
var err error
switch addr.Network {
case "":
addr.Network = "tcp"
goto tcp
case "tcp", "tcp4", "tcp6":
goto tcp
case "tls": //此形式目前被用于dns配置中 的 dns over tls 的 url中
istls = true
goto tcp
case "udp", "udp4", "udp6":
ua := addr.ToUDPAddr()
if !machineCanConnectToIpv6 && addr.IP.To4() == nil {
return nil, ErrMachineCantConnectToIpv6
}
return DialUDP(ua)
default:
goto defaultPart
}
tcp:
//本以为直接用 DialTCP 可以加速拨号结果发现go官方包内部依然还是把地址转换回字符串再拨号
if addr.IP != nil {
if addr.IP.To4() == nil {
if !machineCanConnectToIpv6 {
return nil, ErrMachineCantConnectToIpv6
} else {
resultConn, err = net.DialTCP("tcp6", nil, &net.TCPAddr{
IP: addr.IP,
Port: addr.Port,
})
goto dialedPart
}
} else {
resultConn, err = net.DialTCP("tcp4", nil, &net.TCPAddr{
IP: addr.IP,
Port: addr.Port,
})
goto dialedPart
}
}
defaultPart:
resultConn, err = net.DialTimeout(addr.Network, addr.String(), time.Second*15)
dialedPart:
if istls && err == nil {
conf := &tls.Config{}
if addr.Name != "" {
conf.ServerName = addr.Name
} else {
conf.InsecureSkipVerify = true
}
tlsconn := tls.Client(resultConn, conf)
err = tlsconn.Handshake()
return tlsconn, err
}
return resultConn, err
}
func (addr Addr) DialWithOpt(sockopt *Sockopt) (net.Conn, error) {
dialer := &net.Dialer{
Timeout: time.Second * 8, //v2ray默认16秒是不是太长了
}
dialer.Control = func(network, address string, c syscall.RawConn) error {
return c.Control(func(fd uintptr) {
SetSockOpt(int(fd), sockopt, addr.IsUDP(), addr.IsIpv6())
})
}
return dialer.Dial(addr.Network, addr.String())
}