Связывание с LOOPBACK в IPV6 - IPV4 привязан к ЛЮБОМУ? - PullRequest
0 голосов
/ 28 октября 2010

Клянусь, я уже видел этот вопрос раньше, но я не могу нажать на волшебную строку поиска, чтобы найти ее для меня:

Я создаю сокет для прослушивания, используя:

s = socket()...
getaddrinfo("::1",...);
bind()...

и я получаю сокет IPV6, связанный с «:: 1», и сокет IPV4, связанный с «0.0.0.0».Я ожидаю, что сокет IPV4 будет привязан к 127.0.0.1.Почему это происходит, и как я могу исправить это, чтобы принимать только локальные соединения на сокете ipv4?

Это на Win7, и я ранее отключил IPV6_V6ONLY.

1 Ответ

1 голос
/ 28 октября 2010

getaddrinfo () и bind () работают только на одном IP одновременно. IPv4 привязывается к 0.0.0.0, если вы не указали свою собственную явную привязку. Похоже, вы вызываете bind () только один раз для части IPv6 сокета с двумя стеками и игнорируете ее часть IPv4. Я не знаю, будет ли это работать, но попробуйте вызвать bind () дважды, один раз с адресом IPv6 ":: 1", и снова с адресом IPv6 ":: FFFF: 127.0.0.1" (помните, что адреса IPv4 на сокет с двумя стеками должен быть представлен как IPv4-сопоставленные адреса IPv6).

...