Я написал простую программу GO, которая слушает 0.0.0.0:9999
и 127.0.0.1:9999
:
func main() {
go bind("0.0.0.0:9999", "111 ")
go func() {
time.Sleep(2 * time.Second)
bind("127.0.0.1:9999", "222 ")
}()
time.Sleep(time.Hour)
}
func bind(address string, content string) {
fmt.Println("-------------", address, "-----------------")
listener, err := net.Listen("tcp", address)
if err != nil {
panic(err)
return
}
fmt.Println(listener.Addr().String())
conn, _ := listener.Accept()
for {
_, err := conn.Write([]byte(content))
if err != nil {
panic(err)
}
time.Sleep(1 * time.Second)
}
}
Значение кода:
Он связывает два адреса и дает разные ответы клиентам из них
- привязка "0.0.0.0:9999": отправит клиенту повтор "111"
- привязка "127.0.0.1:9999": отправит повтор "222" клиенту
А потом я использую telnet, чтобы попробовать разные адреса, и ответы:
telnet 127.0.0.1 9999
: 222
(ОК)
telnet localhost 9999
: 111
(ПОЧЕМУ?!)
telnet 0.0.0.0 9999
: 222
(ПОЧЕМУ?!)
telnet <my-internal-ip> 9999
: 111
(ОК)
Я смущен некоторыми из них:
telnet localhost 9999
: 111
(ПОЧЕМУ?!)
localhost
должно указывать на 127.0.0.1
, поэтому я думаю, что это то же самое, что и telnet 127.0.0.1 9999
, и ответ должен быть 222
, но фактический - 111
telnet 0.0.0.0 9999
: 222
(ПОЧЕМУ?!)
Я думаю 0.0.0.0
не то же самое, что 127.0.0.1
, я ожидаю получить ответ 111
, но получу 222
У меня также есть демонстрационный проект: https://github.com/golang-demos/go-bind-0.0.0.0-127.0.0.1-demo
Обновление: моя ОС - OSX