我试图使用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是远程地址(都在同一个接口上)。
我更改连接呼叫的远程地址,并得到以下内容:
如果我改用IPv4连接,那么连接也可以工作。
我认为必须有一个路由问题,但我不知道需要改变什么。 首先我应该在理论上做到这一点?
任何想法出了什么问题?
~$ man getaddrinfo
。