mirror of https://github.com/v2ray/v2ray-core
refine system dialer substitution
parent
27a29da7bf
commit
ca0ae50e62
|
@ -4,7 +4,6 @@ import (
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
"errors"
|
"errors"
|
||||||
"net"
|
"net"
|
||||||
"time"
|
|
||||||
|
|
||||||
v2net "github.com/v2ray/v2ray-core/common/net"
|
v2net "github.com/v2ray/v2ray-core/common/net"
|
||||||
v2tls "github.com/v2ray/v2ray-core/transport/internet/tls"
|
v2tls "github.com/v2ray/v2ray-core/transport/internet/tls"
|
||||||
|
@ -56,30 +55,5 @@ func Dial(src v2net.Address, dest v2net.Destination, settings *StreamSettings) (
|
||||||
}
|
}
|
||||||
|
|
||||||
func DialToDest(src v2net.Address, dest v2net.Destination) (net.Conn, error) {
|
func DialToDest(src v2net.Address, dest v2net.Destination) (net.Conn, error) {
|
||||||
|
return effectiveSystemDialer.Dial(src, dest)
|
||||||
if isDefaultDialerSubstituted() {
|
|
||||||
dialer := v2AlternativeDialer
|
|
||||||
return (*dialer).Dial(dest.Network().String(), dest.NetAddr())
|
|
||||||
} else {
|
|
||||||
dialer := &net.Dialer{
|
|
||||||
Timeout: time.Second * 60,
|
|
||||||
DualStack: true,
|
|
||||||
}
|
|
||||||
if src != nil && src != v2net.AnyIP {
|
|
||||||
var addr net.Addr
|
|
||||||
if dest.IsTCP() {
|
|
||||||
addr = &net.TCPAddr{
|
|
||||||
IP: src.IP(),
|
|
||||||
Port: 0,
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
addr = &net.UDPAddr{
|
|
||||||
IP: src.IP(),
|
|
||||||
Port: 0,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
dialer.LocalAddr = addr
|
|
||||||
}
|
|
||||||
return dialer.Dial(dest.Network().String(), dest.NetAddr())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,18 +0,0 @@
|
||||||
package internet
|
|
||||||
|
|
||||||
import "net"
|
|
||||||
|
|
||||||
var v2AlternativeDialer *V2AlternativeDialerT
|
|
||||||
|
|
||||||
type V2AlternativeDialerT interface {
|
|
||||||
Dial(nw string, ad string) (net.Conn, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
func SubstituteDialer(substituteWith V2AlternativeDialerT) error {
|
|
||||||
v2AlternativeDialer = &substituteWith
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func isDefaultDialerSubstituted() bool {
|
|
||||||
return (v2AlternativeDialer != nil)
|
|
||||||
}
|
|
|
@ -0,0 +1,74 @@
|
||||||
|
package internet
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
v2net "github.com/v2ray/v2ray-core/common/net"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
effectiveSystemDialer SystemDialer
|
||||||
|
)
|
||||||
|
|
||||||
|
type SystemDialer interface {
|
||||||
|
Dial(source v2net.Address, destination v2net.Destination) (net.Conn, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type DefaultSystemDialer struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *DefaultSystemDialer) Dial(src v2net.Address, dest v2net.Destination) (net.Conn, error) {
|
||||||
|
dialer := &net.Dialer{
|
||||||
|
Timeout: time.Second * 60,
|
||||||
|
DualStack: true,
|
||||||
|
}
|
||||||
|
if src != nil && src != v2net.AnyIP {
|
||||||
|
var addr net.Addr
|
||||||
|
if dest.IsTCP() {
|
||||||
|
addr = &net.TCPAddr{
|
||||||
|
IP: src.IP(),
|
||||||
|
Port: 0,
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
addr = &net.UDPAddr{
|
||||||
|
IP: src.IP(),
|
||||||
|
Port: 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dialer.LocalAddr = addr
|
||||||
|
}
|
||||||
|
return dialer.Dial(dest.Network().String(), dest.NetAddr())
|
||||||
|
}
|
||||||
|
|
||||||
|
type SystemDialerAdapter interface {
|
||||||
|
Dial(network string, address string) (net.Conn, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type SimpleSystemDialer struct {
|
||||||
|
adapter SystemDialerAdapter
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *SimpleSystemDialer) Dial(src v2net.Address, dest v2net.Destination) (net.Conn, error) {
|
||||||
|
return this.adapter.Dial(dest.Network().String(), dest.NetAddr())
|
||||||
|
}
|
||||||
|
|
||||||
|
func UseAlternativeSystemDialer(dialer SystemDialer) {
|
||||||
|
effectiveSystemDialer = dialer
|
||||||
|
}
|
||||||
|
|
||||||
|
func UseAlternativeSimpleSystemDialer(dialer SystemDialerAdapter) {
|
||||||
|
effectiveSystemDialer = &SimpleSystemDialer{
|
||||||
|
adapter: dialer,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Deprecated: Use UseAlternativeSimpleSystemDialer.
|
||||||
|
func SubstituteDialer(dialer SystemDialerAdapter) error {
|
||||||
|
UseAlternativeSimpleSystemDialer(dialer)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
effectiveSystemDialer = &DefaultSystemDialer{}
|
||||||
|
}
|
Loading…
Reference in New Issue