package net import ( "fmt" "net" "net/http" "sync" ) type DualStackHTTPServer struct { Handler http.Handler } func (s *DualStackHTTPServer) ListenAndServe(ipv4 string, ipv6 string, port int) error { v4Listener, err := net.Listen("tcp4", fmt.Sprintf("%s:%d", ipv4, port)) if err != nil { return fmt.Errorf("IPv4 listen: %v", err) } v6Listener, err := net.Listen("tcp6", fmt.Sprintf("[%s]:%d", ipv6, port)) if err != nil { v4Listener.Close() return fmt.Errorf("IPv6 listen: %v", err) } srv := &http.Server{ Handler: s.Handler } var wg sync.WaitGroup errs := make(chan error, 2) for _, listener := range []net.Listener{v4Listener, v6Listener} { wg.Add(1) go func(l net.Listener) { defer wg.Done() errs <- srv.Serve(l) }(listener) } return <-errs }