fixed a bug in proxy check which may leads to socket error: too many open files.

This commit is contained in:
nadoo 2017-07-14 20:52:49 +08:00
parent 4772bfb7c6
commit c79a9ee36d
4 changed files with 20 additions and 26 deletions

36
main.go
View File

@ -124,33 +124,25 @@ func main() {
}
var forwarders []Proxy
if len(flags.Forward) > 0 {
for _, chain := range flags.Forward {
var forward Proxy
var err error
for _, chain := range flags.Forward {
var forward Proxy
for _, url := range strings.Split(chain, ",") {
forward, err = ProxyFromURL(url, forward)
if err != nil {
log.Fatal(err)
}
}
forwarders = append(forwarders, forward)
}
}
for _, forward := range forwarders {
go check(forward, config.CheckSite, config.CheckDuration)
}
if len(flags.Listen) > 0 {
for _, listen := range flags.Listen {
local, err := ProxyFromURL(listen, forwarders...)
for _, url := range strings.Split(chain, ",") {
forward, err = ProxyFromURL(url, forward)
if err != nil {
log.Fatal(err)
}
go local.ListenAndServe()
}
forwarders = append(forwarders, forward)
}
for _, listen := range flags.Listen {
local, err := ProxyFromURL(listen, forwarders...)
if err != nil {
log.Fatal(err)
}
go local.ListenAndServe()
}
sigCh := make(chan os.Signal, 1)

View File

@ -88,7 +88,7 @@ func ProxyFromURL(s string, forwarders ...Proxy) (Proxy, error) {
}
var proxy Proxy
if forwarders == nil || len(forwarders) == 0 {
if len(forwarders) == 0 {
proxy = newProxy(addr, Direct)
} else if len(forwarders) == 1 {
proxy = newProxy(addr, forwarders[0])
@ -144,7 +144,7 @@ func check(p Proxy, target string, duration int) {
p.SetEnable(false)
continue
}
defer c.Close()
c.Close()
p.SetEnable(true)
logf("proxy %s check ok.", p.Addr())

View File

@ -64,8 +64,6 @@ func (s *redir) ListenAndServe() {
defer rc.Close()
logf("proxy-redir %s <-> %s", c.RemoteAddr(), tgt)
// go io.Copy(rc, c)
// io.Copy(c, rc)
_, _, err = relay(c, rc)
if err != nil {

View File

@ -20,6 +20,10 @@ func newStrategyProxy(addr string, forwarders []Proxy) Proxy {
return newProxy(addr, forwarders[0])
}
for _, forward := range forwarders {
go check(forward, config.CheckSite, config.CheckDuration)
}
return &strategyProxy{addr: addr, forwarders: forwarders}
}