【发布时间】:2012-08-28 21:47:03
【问题描述】:
我有这个简单的客户端-服务器应用程序对。代码非常简单,我只使用新的、建议的方法,如 getaddinfo 等,一切都适用于 ipv4。即使对于 ipv6 环回 (::1) 它也有效。当涉及到其他一些 ipv6 地址时,问题就开始了......我在网络中有两台机器,当我传递它们的 ipv4 地址时一切正常,但是当我给我的客户端 ipv6 地址时,我在连接函数上得到一个错误:无效参数. 嘿,我不是已经知道了吗?我愿意!当我尝试 ping6 这个 ipv6 地址时,我得到了同样的错误:
连接:无效参数
但是有一种方法可以克服这个障碍——人们应该选择一个带有 -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;
}
【问题讨论】:
-
ping 拒绝的这个有问题的地址是什么?
-
我正在 ping 我网络中的另一台机器,但它对所有 ipv6 地址的工作方式相同 - 请检查:lists.debian.org/debian-ipv6/2005/06/msg00044.html
-
@flyjohny 也许你应该检查你的路由,看看默认路由是否是 ip6 路由命令:“route -A inet6”