连接到IPv4映射的IPv6地址失败

我试图使用IPv6套接字连接到IPv4地址使用IPv4映射的IPv6地址,在Linux(debian-lenny-64 2.6.26-2-amd64)

#include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <errno.h> #include <stdlib.h> #include <stdio.h> int main(int argc, void **argv) { struct addrinfo *sa; struct addrinfo *ra; int err = getaddrinfo("2001:DB8::2", 0, 0, &sa); int fd = socket(sa->ai_family, SOCK_DGRAM, 0); int v6only = 0; err = setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (void *)&v6only, sizeof(v6only)); err = bind(fd, sa->ai_addr, sa->ai_addrlen); err = getaddrinfo("::ffff:192.168.0.1", "9", 0, &ra); // err = getaddrinfo("2001:DB8::1", "9", 0, &ra); // err = getaddrinfo("::ffff:127.0.0.1", "9", 0, &ra); err = connect(fd, (struct sockaddr *)ra->ai_addr, sizeof(struct sockaddr_in6)); } 

(我已经从粘贴的代码中删除了错误testing)

2001:DB8 :: 2和192.168.0.2是本地地址(都在同一个接口上)。
2001:DB8 :: 1和192.168.0.1是远程地址(都在同一个接口上)。

我更改连接呼叫的远程地址,并得到以下内容:

  • 连接到:: ffff:127.0.0.1成功(本地主机)
  • 连接到2001:DB8 :: 1成功(远程IPv6地址)
  • 连接到:: ffff:192.168.0.2成功(本地IPv4地址)
  • 连接到:: ffff:192.168.0.1失败(22无效参数 – 远程IPv4)

如果我改用IPv4连接,那么连接也可以工作。

我认为必须有一个路由问题,但我不知道需要改变什么。 首先我应该在理论上做到这一点?
任何想法出了什么问题?

  • 请参阅函数“getaddrinfo()”
      ~$ man getaddrinfo 

  • 如果将其设置为“ AI_PASSIVE ”,则该函数的“ 提示 ”参数具有属性“ ai_flags ”。 它可以用于IPv4和IPv6寻址模式。