绑定到IPV6中的LOOPBACK - IPV4绑定到任何?

时间:2010-10-27 20:28:14

标签: winsock

我发誓我以前见过这个问题,但是我无法找到魔法搜索字符串来找到它:

我创建了一个用于监听的套接字:

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

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

这是在Win7上我之前关闭了IPV6_V6ONLY。

1 个答案:

答案 0 :(得分:1)

getaddrinfo()和bind()一次只能在一个IP上运行。如果您未指定自己的显式绑定,则IPv4绑定到0.0.0.0。听起来你只为双栈套接字的IPv6部分调用bind()一次并忽略其IPv4部分。我不知道这是否可行,但尝试两次调用bind(),一次使用IPv6“:: 1”地址,再使用IPv6“:: FFFF:127.0.0.1”地址(请记住,双栈套接字必须表示为IPv4映射的IPv6地址。)