fix: tcp concurrent force close when context done

This commit is contained in:
gVisor bot 2022-06-25 09:00:35 +08:00
parent bb2b64ba42
commit ae3e6524c5

View file

@ -4,11 +4,10 @@ import (
"context"
"errors"
"fmt"
"github.com/Dreamacro/clash/component/resolver"
"net"
"net/netip"
"sync"
"github.com/Dreamacro/clash/component/resolver"
)
var (
@ -171,7 +170,10 @@ func dualStackDialContext(ctx context.Context, network, address string, opt *opt
go startRacer(ctx, network+"4", host, opt.direct, false)
go startRacer(ctx, network+"6", host, opt.direct, true)
for res := range results {
count := 2
for i := 0; i < count; i++ {
select {
case res := <-results:
if res.error == nil {
return res.Conn, nil
}
@ -191,6 +193,9 @@ func dualStackDialContext(ctx context.Context, network, address string, opt *opt
return nil, primary.error
}
}
case <-ctx.Done():
break
}
}
return nil, errors.New("never touched")
@ -225,7 +230,6 @@ func concurrentDialContext(ctx context.Context, network string, ips []netip.Addr
}
results := make(chan dialResult)
tcpRacer := func(ctx context.Context, ip netip.Addr) {
result := dialResult{ip: ip}
@ -252,13 +256,13 @@ func concurrentDialContext(ctx context.Context, network string, ips []netip.Addr
}
connCount := len(ips)
for res := range results {
connCount--
for i := 0; i < connCount; i++ {
select {
case res := <-results:
if res.error == nil {
return res.Conn, nil
}
if connCount == 0 {
case <-ctx.Done():
break
}
}