Kaynağa Gözat

refine system dialer substitution

v2ray 9 yıl önce
ebeveyn
işleme
ca0ae50e62

+ 1 - 27
transport/internet/dialer.go

@@ -4,7 +4,6 @@ import (
 	"crypto/tls"
 	"errors"
 	"net"
-	"time"
 
 	v2net "github.com/v2ray/v2ray-core/common/net"
 	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) {
-
-	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())
-	}
+	return effectiveSystemDialer.Dial(src, dest)
 }

+ 0 - 18
transport/internet/dialerSubstitute.go

@@ -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)
-}

+ 74 - 0
transport/internet/system_dialer.go

@@ -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{}
+}