2010-10-27 31 views
0

我发誓,我已经看到了这个问过,但我不能想出魔搜索字符串找到对我来说:绑定在IPV6环回 - IPV4被绑定到任何?

我创建使用监听套接字:

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

和我最终得到绑定到“:: 1”的IPV6套接字和绑定到“0.0.0.0”的IPV4套接字。我期望获得绑定到“127.0.0.1”的IPV4套接字。为什么会发生这种情况,我如何解决它只接受ipv4套接字上的本地主机连接?

这是Win7和我以前关闭IPV6_V6ONLY。

回答

1

的getaddrinfo()和bind()只在一个IP在一个时间进行操作。如果您没有指定自己的显式绑定,则IPv4会绑定到0.0.0.0。这听起来好像你只为一个双堆栈套接字的IPv6部分调用bind()一次而忽略它的IPv4部分。我不与IPv6的“:: FFFF:127.0.0.1”知道这是否会工作,但尝试调用bind()两次,IPv6的“:: 1”地址一次,又一次地址(请记住,IPv4的一个地址双栈套接字必须表示为IPv4映射的IPv6地址)。

+0

我不知道我跟着。我无法在同一套接字上调用绑定两次,第二次调用应该会落下,不是? – 2010-10-28 21:32:27

+0

(当你禁用IPV6_V6ONLY选项,你会得到)双叠层插槽支持同一插座上同时支持IPv4和IPv6。我从来没有使用双栈套接字,这就是为什么我说“我不知道这是否会工作”。对于任何平台,我找不到任何文档说明双栈套接字的IPv4方在bind()过程中的行为。但是,最终它仍然只是一个IPv6套接字,所以我期望bind()实际上完全忽略IPv4 0.0.0.0,并且只接受来自127.0.0.1的流量,因为这是IPv6绑定的内容。 – 2010-10-29 00:52:29

+0

顺便说一下,你并不是唯一注意到Windows上的“:: 1/0.0.0.0”问题的人:Dave在本次讨论中指出了同样的问题:http://stackoverflow.com/questions/1618240/how-to- support-both-ipv4-and-ipv6-connections – 2010-10-29 01:01:36