Hi,
I recently discovered this strange behaviour, Windows allows the
coexistence of three types of sockets on the same transport-layer service
port, for example, 127.0.0.1:8080, [::1]:8080 and [::ffff:0.0.0.0]:8080.
So if you use something like:
net.Listen("tcp", fmt.Sprintf(":%d", port)
and another program already uses the same port using an IPv4 address,
Listen will not fail.
If instead you use:
net.Listen("tcp4", fmt.Sprintf(":%d", port)
it will fail as expected.
Based on the following issues, this is the intended behaviour
https://github.com/golang/go/issues/45150
https://github.com/golang/go/issues/30291
so a Go listener behaves differently based on the operating system and this
could cause unexpected bug reports from Windows users.
In my program I want to listen on both IPv4 and IPv6 (if available) and so
I use "tcp" as address.
To be able to detect port conflict with other programs, I have to do
something like this:
if runtime.GOOS != osWindows {
return
}
listener, err := net.Listen("tcp4", fmt.Sprintf(":%d", port))
if err != nil {
os.Exit(1)
}
listener.Close()
before starting net.Listen with "tcp" address.
So all of you use a similar fix? Do you know a cleaner solution?
I would have expected such a workaround within Go itself if it is the only
way.
Based on the above issues, python had the same problem in the past but it
seems now fixed in recent versions.
Thank you
Nicola
--
You received this message because you are subscribed to the Google Groups
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/golang-nuts/cf310370-eaea-45a8-bf13-1a8bbc919fc4n%40googlegroups.com.