diff --git a/AndroidLibV2rayLite/VPN/vpnservice_support.go b/AndroidLibV2rayLite/VPN/vpnservice_support.go index f7456cac..518036e8 100644 --- a/AndroidLibV2rayLite/VPN/vpnservice_support.go +++ b/AndroidLibV2rayLite/VPN/vpnservice_support.go @@ -24,6 +24,7 @@ type resolved struct { domain string IPs []net.IP Port int + lastResolved time.Time ipIdx uint8 ipLock sync.Mutex lastSwitched time.Time @@ -97,7 +98,7 @@ func (d *ProtectedDialer) PrepareResolveChan() { d.resolveChan = make(chan struct{}) } -func (d *ProtectedDialer) ResolveChan() <-chan struct{} { +func (d *ProtectedDialer) ResolveChan() chan struct{} { return d.resolveChan } @@ -137,9 +138,10 @@ func (d *ProtectedDialer) lookupAddr(addr string) (*resolved, error) { } rs := &resolved{ - domain: host, - IPs: IPs, - Port: portnum, + domain: host, + IPs: IPs, + Port: portnum, + lastResolved: time.Now(), } return rs, nil @@ -150,7 +152,6 @@ func (d *ProtectedDialer) PrepareDomain(domainName string, closeCh <-chan struct log.Printf("Preparing Domain: %s", domainName) d.currentServer = domainName - defer close(d.resolveChan) maxRetry := 10 for { if maxRetry == 0 { @@ -212,6 +213,10 @@ func (d *ProtectedDialer) Dial(ctx context.Context, } } + if time.Now().Sub(d.vServer.lastResolved) > time.Minute * 30 { + d.PrepareDomain(Address, nil) + } + fd, err := d.getFd(dest.Network) if err != nil { return nil, err diff --git a/AndroidLibV2rayLite/interact.go b/AndroidLibV2rayLite/interact.go index b15df2dc..6b49ed3c 100644 --- a/AndroidLibV2rayLite/interact.go +++ b/AndroidLibV2rayLite/interact.go @@ -71,7 +71,10 @@ func (v *V2RayPoint) RunLoop() (err error) { if !v.status.IsRunning { v.closeChan = make(chan struct{}) v.dialer.PrepareResolveChan() - go v.dialer.PrepareDomain(v.DomainName, v.closeChan) + go func() { + v.dialer.PrepareDomain(v.DomainName, v.closeChan) + close(v.dialer.ResolveChan()) + }() go func() { select { // wait until resolved