首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >connect()用ipv6地址返回“无效参数”

connect()用ipv6地址返回“无效参数”
EN

Stack Overflow用户
提问于 2012-09-04 08:57:34
回答 3查看 17.1K关注 0票数 9

我有一个简单的客户机-服务器应用程序对。代码非常简单,我只使用新的、建议使用的方法,如getaddinfo等,对于ipv4来说一切都很好。即使对于ipv6回环(::1),它也能工作。当涉及到其他一些ipv6地址时,问题就开始了.我在一个网络中有两台机器,当我传递它们的ipv4地址时,一切都很正常,但是当我给出我的客户端ipv6地址时,我在连接函数上得到了一个错误:无效参数。嘿,我不是已经知道了吗?我知道!当我尝试ping6这个ipv6地址时,我会得到相同的错误:

连接:无效参数

但是有一种克服这个障碍的方法--我们应该选择一个带有-I开关的接口,从那时起,它就能顺利运行了。但如何在我的客户端应用程序中实现同样的功能呢?我该怎么办?我的客户代码如下所示:

代码语言:javascript
复制
struct addrinfo hints;
struct addrinfo *server;

memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;

int status;
if((status = getaddrinfo(argv[1], argv[2], &hints, &server) != 0))
{
    perror("getaddrinfo error");
    return 1;
}

int sock_fd;
struct addrinfo *ptr;
for(ptr=server;ptr!=NULL;ptr=ptr->ai_next)
{
    if( (sock_fd = socket(ptr->ai_family,ptr->ai_socktype,ptr->ai_protocol)) == -1)
    {
        perror("socket error");
        continue;
    }
    if( connect(sock_fd, ptr->ai_addr,ptr->ai_addrlen) == -1 )
    {
        perror("connect error");
        continue;       
    }
    break;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-04 10:01:25

ff...开头的地址是多播地址。将流连接到多播地址不起作用。

fe80...开始的地址是链接本地地址,它们有一个与它们关联的接口标识符.尝试查看从sockaddr返回的getaddrinfoscope字段是否已填写完毕?

票数 8
EN

Stack Overflow用户

发布于 2014-09-30 21:37:41

您需要为IPv6 ping指定接口(即-I eth0):

代码语言:javascript
复制
ping6 -I eth0 fe80::208:54ff:fe34:22ae

使用IPv6 ping的链接本地地址,需要定义它必须发送/接收数据包的设备--每个设备都有一个链路本地地址。

如果没有这样的尝试,将导致错误消息,如:

代码语言:javascript
复制
--> # ping6 fe80::208:54ff:fe34:22ae 
connect: Invalid argument

在这种情况下,您必须另外指定接口,如下所示:

代码语言:javascript
复制
--> # ping6 -I eth0 fe80::208:54ff:fe34:22ae
PING fe80::208:54ff:fe34:22ae(fe80::208:54ff:fe34:22ae) from fe80::208:54ff:fe34:22ae eth0: 56 data bytes
64 bytes from fe80::208:54ff:fe34:22ae: icmp_seq=0 ttl=64 time=0.027 ms
64 bytes from fe80::208:54ff:fe34:22ae: icmp_seq=1 ttl=64 time=0.030 ms
64 bytes from fe80::208:54ff:fe34:22ae: icmp_seq=2 ttl=64 time=0.036 ms

在客户端应用程序中必须遵循的一种类似方法。

票数 9
EN

Stack Overflow用户

发布于 2012-09-04 09:08:41

我的建议是在接口/网络连接中打开IP6协议,此外,如果仍然存在错误,则丢弃ip4协议。

在我的Linux上,当我的ip4接口激活,我的应用程序尝试使用带有ip6设置的ip4接口时,也发生了这种情况。同样的情况也应该适用于windows。

如果有什么不清楚,问一问。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12260003

复制
相关文章

相似问题

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