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

时间:2012-03-27 15:33:53

标签: c linux sockets ipv6

我正在尝试使用IPv6套接字使用IPv4映射的IPv6地址连接到IPv4地址,在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));
}

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

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

我更改了连接呼叫的远程地址并获取以下内容:

  • connect to :: ffff:127.0.0.1 success(localhost)
  • 连接到2001:DB8 :: 1成功(远程IPv6地址)
  • connect to :: ffff:192.168.0.2 success(本地IPv4地址)
  • connect to :: ffff:192.168.0.1 failure(22无效参数 - 远程IPv4)

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

我认为在某个地方必定存在路由问题,但我无法解决我需要改变的问题。 首先,我理论上应该能够做到这一点吗? 出了什么问题?

1 个答案:

答案 0 :(得分:1)

  • 将函数“getaddrinfo()”视为
     ~$ man getaddrinfo 
  • 如果您将其设置为“ AI_PASSIVE ”,则该功能的“提示”参数具有属性“ ai_flags ”。它可以用于IPv4和IPv6寻址模式。