Fix the "address already in use" issue

This commit is contained in:
Star Brilliant
2018-04-16 13:58:38 +08:00
parent 34adf40b36
commit 7d5cf98d2b
3 changed files with 22 additions and 22 deletions
+5 -5
View File
@@ -154,24 +154,24 @@ func (c *Client) newHTTPClient() error {
} }
func (c *Client) Start() 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...) { for _, srv := range append(c.udpServers, c.tcpServers...) {
go func(srv *dns.Server) { go func(srv *dns.Server) {
err := srv.ListenAndServe() err := srv.ListenAndServe()
if err != nil { if err != nil {
log.Println(err) log.Println(err)
} }
result <- err results <- err
}(srv) }(srv)
} }
for i := 0; i < cap(result); i++ { for i := 0; i < cap(results); i++ {
err := <-result err := <-results
if err != nil { if err != nil {
return err return err
} }
} }
close(result) close(results)
return nil return nil
} }
+1 -4
View File
@@ -43,8 +43,5 @@ func main() {
} }
server := NewServer(conf) server := NewServer(conf)
err = server.Start() _ = server.Start()
if err != nil {
log.Fatalln(err)
}
} }
+16 -13
View File
@@ -75,26 +75,29 @@ func (s *Server) Start() error {
if s.conf.Verbose { if s.conf.Verbose {
servemux = handlers.CombinedLoggingHandler(os.Stdout, servemux) 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 { for _, addr := range s.conf.Listen {
if s.conf.Cert != "" || s.conf.Key != "" { go func(addr string) {
go func() { var err error
listeners <- http.ListenAndServeTLS(addr, s.conf.Cert, s.conf.Key, servemux) if s.conf.Cert != "" || s.conf.Key != "" {
}() err = http.ListenAndServeTLS(addr, s.conf.Cert, s.conf.Key, servemux)
continue } else {
} err = http.ListenAndServe(addr, servemux)
go func() { }
listeners <- http.ListenAndServe(addr, servemux) if err != nil {
}() log.Println(err)
}
results <- err
}(addr)
} }
// wait for all handlers // wait for all handlers
for i := 0; i < cap(listeners); i++ { for i := 0; i < cap(results); i++ {
err := <-listeners err := <-results
if err != nil { if err != nil {
return err return err
} }
} }
close(listeners) close(results)
return nil return nil
} }