К сожалению, это зависит от используемой операционной системы.
В 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.
Надеюсь это поможет.