Unfortunately, this differs depending on what operating system you are using.
On Microsoft Windows, binding a socket to ::
only binds to the IPv6 ports. Thus to listen on all addresses on both IPv4 and IPv6, you need to bind to 0.0.0.0
as well as ::
. The following extract is from a Vista box:
C:\>netstat -an | find "445"
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING
TCP [::]:445 [::]:0 LISTENING
The example I give is port 445, used for SMB traffic when NetBIOS isn't used. As you can see, it is binding to both 0.0.0.0
and ::
to make, respectively, both IPv4 and IPv6 clients work.
On Linux, ::
is inclusive of the IPv4-compatible addresses, as you have correctly guessed, so binding to 0.0.0.0
as well is unnecessary. I wrote a simple Python program that only binds to an AF_INET6
socket on ::
. Even though I didn't also bind to an AF_INET
(IPv4) socket, it still accepts connections from IPv4 clients. If, say, 10.1.1.3
connects to it, it will show up as connecting from ::ffff:10.1.1.3
.
Except that it gets hairy. The above doesn't apply on Linux if /proc/sys/net/ipv6/bindv6only
is set to 1
, in which case the behaviour is exactly the same as Windows -- binding to ::
will only listen for IPv6 requests. If you want to listen for IPv4 requests as well, you will need to create an AF_INET
socket and listen on 0.0.0.0
as well. Fortunately, the default for bindv6only
is 0
, so there's a very slim chance you'll ever have to deal with this (except if you use Debian, which actually defaults to bindv6only = 1
).
All of this is handy to know in checking to see if a service is IPv6-enabled, and whether it is IPv4-enabled as well. Here is my SSH server:
$ netstat -64ln | grep 22
tcp6 0 0 :::22 :::* LISTEN
As you can see, SSH is only listening on ::
port 22. However, it is not just listening for IPv6 clients -- it works fine from IPv4 clients, because of the IPv4-compatible binding. To prove this, if you look at this:
$ cat /proc/sys/net/ipv6/bindv6only
0
bindv6only
is disabled (the default). If that were set to 1
, then I would have to encourage SSH to listen on 0.0.0.0
as well (or instead).
Apologies for having no information on the Mac OS X side of things. I have used it in the past, but I prefer the aesthetics of GNOME, so I haven't used it in a very long time. However, I would guess that the behaviour is the same as that of Linux.
Hope this helps.