首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连接到IPv4映射的IPv6地址失败

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

Stack Overflow用户
提问于 2012-03-27 15:33:53
回答 1查看 3.5K关注 0票数 2

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

代码语言:javascript
复制
#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是远程地址(都位于同一个接口上)。

我更改连接呼叫的远程地址,并获得以下信息:

连接到::ffff:127.0.0.1 success (localhost)

  • connect to 2001:DB8::1 success (remote IPv6 address)

  • connect to ::ffff:192.168.0.2 success (本地IPv4 address)

  • connect to ::ffff:192.168.0.1 failure (22个无效参数- remote IPv4)

)

如果我更改为执行IPv4连接,那么这些连接也可以工作。

我想在某个地方的路由肯定有问题,但是我不知道我需要改变什么。首先,理论上我应该能够做到吗?

有什么不对吗?

EN

回答 1

Stack Overflow用户

发布于 2012-05-18 03:07:51

  • 将函数" getaddrinfo ()“看作~$ man

.

  • 函数的“提示”参数具有属性'ai_flags',如果您将其设置为'AI_PASSIVE‘。它可以同时适用于IPv4和IPv6寻址模式。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9892770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档