Compare commits

...

2 Commits

Author SHA1 Message Date
Star Brilliant
627e2d639d Release 1.3.1 2018-04-16 13:59:03 +08:00
Star Brilliant
7d5cf98d2b Fix the "address already in use" issue 2018-04-16 13:58:38 +08:00
4 changed files with 26 additions and 22 deletions

View File

@@ -4,6 +4,10 @@ This Changelog records major changes between versions.
Not all changes are recorded. Please check git log for details. Not all changes are recorded. Please check git log for details.
## Version 1.3.1
- Fix the "address already in use" issue
## Version 1.3.0 ## Version 1.3.0
- Breaking change: Add client / server support for multiple listen address - Breaking change: Add client / server support for multiple listen address

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
} }

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)
}
} }

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
} }