From 7d5cf98d2bf0d6032bb122ecf1b9bd65a2c99338 Mon Sep 17 00:00:00 2001 From: Star Brilliant Date: Mon, 16 Apr 2018 13:58:28 +0800 Subject: [PATCH] Fix the "address already in use" issue --- doh-client/client.go | 10 +++++----- doh-server/main.go | 5 +---- doh-server/server.go | 29 ++++++++++++++++------------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/doh-client/client.go b/doh-client/client.go index 05f909a..260c536 100644 --- a/doh-client/client.go +++ b/doh-client/client.go @@ -154,24 +154,24 @@ func (c *Client) newHTTPClient() error { } func (c *Client) Start() error { - result := make(chan error, len(c.udpServers)+len(c.tcpServers)) + results := make(chan error, len(c.udpServers)+len(c.tcpServers)) for _, srv := range append(c.udpServers, c.tcpServers...) { go func(srv *dns.Server) { err := srv.ListenAndServe() if err != nil { log.Println(err) } - result <- err + results <- err }(srv) } - for i := 0; i < cap(result); i++ { - err := <-result + for i := 0; i < cap(results); i++ { + err := <-results if err != nil { return err } } - close(result) + close(results) return nil } diff --git a/doh-server/main.go b/doh-server/main.go index ac9bd75..5e970cb 100644 --- a/doh-server/main.go +++ b/doh-server/main.go @@ -43,8 +43,5 @@ func main() { } server := NewServer(conf) - err = server.Start() - if err != nil { - log.Fatalln(err) - } + _ = server.Start() } diff --git a/doh-server/server.go b/doh-server/server.go index 1cf8f8c..9bd26a2 100644 --- a/doh-server/server.go +++ b/doh-server/server.go @@ -75,26 +75,29 @@ func (s *Server) Start() error { if s.conf.Verbose { servemux = handlers.CombinedLoggingHandler(os.Stdout, servemux) } - listeners := make(chan error, len(s.conf.Listen)) + results := make(chan error, len(s.conf.Listen)) for _, addr := range s.conf.Listen { - if s.conf.Cert != "" || s.conf.Key != "" { - go func() { - listeners <- http.ListenAndServeTLS(addr, s.conf.Cert, s.conf.Key, servemux) - }() - continue - } - go func() { - listeners <- http.ListenAndServe(addr, servemux) - }() + go func(addr string) { + var err error + if s.conf.Cert != "" || s.conf.Key != "" { + err = http.ListenAndServeTLS(addr, s.conf.Cert, s.conf.Key, servemux) + } else { + err = http.ListenAndServe(addr, servemux) + } + if err != nil { + log.Println(err) + } + results <- err + }(addr) } // wait for all handlers - for i := 0; i < cap(listeners); i++ { - err := <-listeners + for i := 0; i < cap(results); i++ { + err := <-results if err != nil { return err } } - close(listeners) + close(results) return nil }