From afaffffa436fa5d0e31afbe16eff77f172a9e542 Mon Sep 17 00:00:00 2001 From: Qian Wang Date: Sat, 24 Mar 2018 12:21:26 +0000 Subject: [PATCH] IPv6 --- cmd/gq-server/gq-server.go | 39 ++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/cmd/gq-server/gq-server.go b/cmd/gq-server/gq-server.go index 93fa878..e0395d5 100755 --- a/cmd/gq-server/gq-server.go +++ b/cmd/gq-server/gq-server.go @@ -238,18 +238,37 @@ func main() { } sta.SetAESKey() go usedRandomCleaner(sta) - listener, err := gotfo.Listen(sta.SS_REMOTE_HOST+":"+sta.SS_REMOTE_PORT, sta.FastOpen) - log.Println("Listening on " + sta.SS_REMOTE_HOST + ":" + sta.SS_REMOTE_PORT) - if err != nil { - log.Fatal(err) - } - for { - conn, err := listener.Accept() + + listen := func(addr, port string) { + listener, err := gotfo.Listen(addr+":"+port, sta.FastOpen) + log.Println("Listening on " + addr + ":" + port) if err != nil { - log.Printf("%v", err) - continue + log.Fatal(err) + } + for { + conn, err := listener.Accept() + if err != nil { + log.Printf("%v", err) + continue + } + go dispatchConnection(conn, sta) + } + } + + // When listening on an IPv6 and IPv4, SS gives REMOTE_HOST as e.g. ::|0.0.0.0 + listeningIP := strings.Split(sta.SS_REMOTE_HOST, "|") + for i, ip := range listeningIP { + if net.ParseIP(ip).To4() == nil { + // IPv6 needs square brackets + ip = "[" + ip + "]" + } + + // The last listener must block main() because the program exits on main return. + if i == len(listeningIP)-1 { + listen(ip, sta.SS_REMOTE_PORT) + } else { + go listen(ip, sta.SS_REMOTE_PORT) } - go dispatchConnection(conn, sta) } }