Say zacznę serwer tak:Jak uzyskać adres http.ListenAndServe
srv := http.Server{
Addr: ":0",
Handler: http.FileServer(http.Dir(".")),
}
go srv.ListenAndServe()
log.Printf("Listening on ???")
Jak mogę sprawdzić, który port został wybrany? :0
jest przeznaczony do wybierania losowego portu efemerycznego przez system operacyjny, ale muszę wiedzieć, który został wybrany.
UWAGA: wolałbym nie stworzyć własną słuchacza i używać srv.Listen(ln)
, ponieważ srv.ListenAndServe()
ma dobrą domyślną (ale unexported) słuchacza, który chcę użyć.
Moje preferencje to tylko preferencja, jestem świadoma tego, że nie jest trudno przejść 'srv.Listen()' trasą. Zakładam, że ponieważ unikasz problemu, nie możesz również znaleźć sposobu na uzyskanie numeru portu? – chowey
Prawidłowo nie można tego zrobić bez rzeczy dużo gorszych niż stworzenie własnego słuchacza. ListenAndServe ma być funkcją wygody. Podobnie jak w przypadku większości takich funkcji, gdy potrzebujesz czegoś specjalnego, musisz użyć funkcji niższego poziomu. –
Należy zauważyć, że używa to nieodportowanego 'tcpKeepAliveListener', więc jeśli chcesz utrzymywać TCP, musisz również [skopiować to źródło] (https://golang.org/src/net/http/server.go?s= 51082: 51123 # L1967) na szczęście to tylko kilkanaście linii trywialnego kodu, ale robi to trochę bardziej denerwujące. –