Solve #218: Supporting substitute of the default Dialer, this is a prerequisite of Libv2ray's support of Android VPNService mode; It is not recommanded to modify exported func introduced by this commit.

pull/219/head
Shelikhoo 2016-07-26 16:33:12 +08:00
parent 6a620d1c6d
commit d1b44619b0
No known key found for this signature in database
GPG Key ID: 7791BDB0709ABD21
2 changed files with 41 additions and 19 deletions

View File

@ -56,26 +56,30 @@ 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) {
dialer := &net.Dialer{
Timeout: time.Second * 60,
DualStack: true,
}
if src != nil && src != v2net.AnyIP { if isDefaultDialerSubstituted() {
var addr net.Addr dialer := v2AlternativeDialer
if dest.IsTCP() { return (*dialer).Dial(dest.Network().String(), dest.NetAddr())
addr = &net.TCPAddr{ } else {
IP: src.IP(), dialer := &net.Dialer{
Port: 0, Timeout: time.Second * 60,
} DualStack: true,
} else {
addr = &net.UDPAddr{
IP: src.IP(),
Port: 0,
}
} }
dialer.LocalAddr = addr 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 dialer.Dial(dest.Network().String(), dest.NetAddr())
} }

View File

@ -0,0 +1,18 @@
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)
}