К сожалению, это зависит от используемой операционной системы.
В Microsoft Windows привязка сокета к привязкам ::только к портам IPv6. Таким образом , чтобы прослушивать все адреса на IPv4 , так и IPv6, необходимо связывать с 0.0.0.0, а также ::. Следующая выдержка из коробки Vista:
C:\>netstat -an | find "445"
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING
TCP [::]:445 [::]:0 LISTENING
В качестве примера я привел порт 445, используемый для трафика SMB, когда NetBIOS не используется. Как вы можете видеть, это является обязательным для обоих, 0.0.0.0и ::для того, чтобы клиенты IPv4 и IPv6 работали соответственно.
В Linux ::он включает в себя адреса, совместимые с IPv4, как вы правильно догадались, поэтому привязка к ним 0.0.0.0также не требуется . Я написал простую программу на Python, которая привязывается только к AF_INET6сокету ::. Несмотря на то, что я также не привязывался к AF_INETсокету (IPv4), он все еще принимает подключения от клиентов IPv4. Если, скажем, 10.1.1.3подключается к нему, он будет отображаться как подключение с ::ffff:10.1.1.3.
За исключением того, что это становится волосатым. Вышеуказанное не относится к Linux, если для /proc/sys/net/ipv6/bindv6onlyнего установлено значение 1, и в этом случае поведение точно такое же, как в Windows - привязка к ::будет прослушивать только запросы IPv6. Если вы также хотите прослушивать запросы IPv4, вам нужно будет создать AF_INETсокет и прослушивать его 0.0.0.0. К счастью, по умолчанию bindv6onlyявляется 0, таким образом , есть очень небольшой шанс , вы всегда будете иметь дело с этим ( за исключением , если вы используете Debian, который на самом деле по умолчанию используется bindv6only = 1).
Все это удобно знать, проверяя, поддерживает ли служба IPv6, а также включена ли поддержка IPv4. Вот мой SSH сервер:
$ netstat -64ln | grep 22
tcp6 0 0 :::22 :::* LISTEN
Как видите, SSH прослушивает только ::порт 22. Однако он не только прослушивает клиенты IPv6 - он отлично работает от клиентов IPv4 благодаря привязке, совместимой с IPv4. Чтобы доказать это, если вы посмотрите на это:
$ cat /proc/sys/net/ipv6/bindv6only
0
bindv6onlyотключено (по умолчанию). Если бы это было установлено 1, то я должен был бы поощрять SSH также слушать 0.0.0.0(или вместо).
Извиняюсь за отсутствие информации о стороне Mac OS X. Я использовал это в прошлом, но я предпочитаю эстетику GNOME, поэтому я не использовал это в течение очень долгого времени. Тем не менее, я бы предположил, что поведение такое же, как и в Linux.
Надеюсь это поможет.