connect()返回带有ipv6地址的“无效参数”

wfypjpf4  于 2023-06-21  发布在  其他
关注(0)|答案(3)|浏览(282)

我有一个简单的客户端-服务器应用程序对。代码非常简单,我只使用了新的,建议的方法,如getaddinfo等,一切都工作得很好,为ipv4。即使对于ipv6 loopback(::1),它也能工作。
当涉及到其他一些ipv6地址时,问题就开始了。我在网络中有两台机器,当我传递它们的ipv4地址时,一切正常,但是当我给予我的客户端ipv6地址时,我在connect函数上得到一个错误:无效参数。
嘿,我不是已经知道了吗?我有!当我尝试ping 6这个ipv6地址时,我得到相同的错误:
connect:参数无效
但有一种方法可以克服这个障碍-一个人应该选择一个带有-I开关的界面,从那时起这一切都运行得很顺利。但是我如何在我的客户端应用程序中实现同样的功能呢?
我该怎么办?我的客户端代码看起来像这样:

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;
}
kxeu7u2r

kxeu7u2r1#

您需要指定IPv6 ping的接口(即- IethO):

ping6 -I eth0 fe80::208:54ff:fe34:22ae

使用本地链路地址进行IPv6 ping,需要定义必须发送/接收数据包的设备-每个设备都有一个本地链路地址。
尝试不使用此选项,将导致以下错误消息:

--> # ping6 fe80::208:54ff:fe34:22ae 
connect: Invalid argument

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

--> # 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

一个类似的方法,你必须遵循在您的客户端应用程序。

xa9qqrwz

xa9qqrwz2#

ff...开头的地址是多播地址。将流连接到多播地址不起作用。
fe80...开头的地址是链路本地地址,具有与其关联的接口标识符。试着查看getaddrinfo返回的sockaddrscope字段是否填写完毕?

xqk2d5yq

xqk2d5yq3#

我的建议是,您在接口/网络连接中打开IP 6协议,此外,如果您仍然有错误,请扔掉IP 4协议。
在我的Linux Box上,当我有一个ip 4接口活动,我的应用程序试图使用ip 4接口与ip 6设置时,这种情况也发生了。这同样适用于Windows。
如果有什么不清楚的地方问。

相关问题