Infelizmente, isso é diferente dependendo do sistema operacional que você está usando.
No Microsoft Windows, a ligação de um soquete a ::
é vinculada apenas às portas IPv6. Assim, para escutar em todos os endereços tanto no IPv4 quanto no IPv6, você precisa se ligar ao 0.0.0.0
e também ao ::
. O extrato a seguir é de uma caixa do Vista:
C:\>netstat -an | find "445"
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING
TCP [::]:445 [::]:0 LISTENING
O exemplo que dou é a porta 445, usada para o tráfego SMB quando o NetBIOS não é usado. Como você pode ver, é obrigatório que 0.0.0.0
e ::
façam, respectivamente, clientes IPv4 e IPv6 trabalharem.
No Linux, ::
é inclusivo dos endereços compatíveis com IPv4, como você adivinhou corretamente, então a ligação a 0.0.0.0
também é desnecessária. Eu escrevi um programa Python simples que só se liga a um soquete AF_INET6
em ::
. Embora eu também não tenha vinculado a um soquete AF_INET
(IPv4), ele ainda aceita conexões de clientes IPv4. Se, digamos, 10.1.1.3
se conectar a ele, ele será exibido como conectando a partir de ::ffff:10.1.1.3
.
Exceto que fica peludo. O acima não se aplica ao Linux se /proc/sys/net/ipv6/bindv6only
estiver definido como 1
, caso em que o comportamento é exatamente igual ao do Windows - a vinculação a ::
somente atenderá a solicitações IPv6. Se você quiser ouvir solicitações IPv4, precisará criar um soquete AF_INET
e também ouvir 0.0.0.0
. Felizmente, o padrão para bindv6only
é 0
, então há uma chance muito pequena que você terá para lidar com isso (exceto se você usar o Debian, que na verdade é o padrão bindv6only = 1
).
Tudo isso é útil saber ao verificar se um serviço está habilitado para IPv6 e se também está habilitado para IPv4. Aqui está o meu servidor SSH:
$ netstat -64ln | grep 22
tcp6 0 0 :::22 :::* LISTEN
Como você pode ver, o SSH está apenas ouvindo ::
port 22. No entanto, ele não está apenas atendendo a clientes IPv6 - funciona bem em clientes IPv4, devido à ligação compatível com IPv4. Para provar isso, se você olhar para isto:
$ cat /proc/sys/net/ipv6/bindv6only
0
bindv6only
está desativado (o padrão). Se isso fosse definido como 1
, eu teria que incentivar o SSH a escutar 0.0.0.0
(ou em vez disso).
Desculpas por não ter informações sobre o lado do Mac OS X das coisas. Eu usei isso no passado, mas eu prefiro a estética do GNOME, então eu não uso há muito tempo. No entanto, eu diria que o comportamento é o mesmo do Linux.
Espero que isso ajude.