【发布时间】:2018-12-07 14:11:22
【问题描述】:
我在获取ipv6 using getaddrinfo() 时遇到问题:
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h>
int main()
{
int soc = 00;
struct addrinfo hints,*results,*res;
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_flags = AI_PASSIVE;
int m = getaddrinfo("myhost","2018",&hints,&results);
if (m<0)
{
printf("getaddrinfo error : %s\n", gai_strerror(m));
return 1;
}
res=results;
do
{
if(res->ai_family == AF_INET6)
{
struct sockaddr_in6* a= (struct sockaddr_in6*)res->ai_addr;
char straddr[INET6_ADDRSTRLEN];
inet_ntop(AF_INET6, &a->sin6_addr, straddr, sizeof(straddr));
printf("IP v6 - %s\n",straddr);
}
if(res->ai_family == AF_INET)
{
struct sockaddr_in* b= (struct sockaddr_in*)res->ai_addr;
const char* dotted_decimal1 = inet_ntoa(b->sin_addr);
printf("IP v4 - %s\n",dotted_decimal1);
}
}
while((res=res->ai_next) !=NULL);
return 0;
}
输出:
IP v4 - xx.xx.xx.xx
由于我设置了hints.ai_family = AF_UNSPEC,它应该返回给我两个细节(ipv4 和ipv6)。 但它只返回 ipv4 的详细信息。
注意:在命令ifconfig 上我可以看到ipv4 和ipv6 地址。
> $ ifconfig
> eth3 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx
> inet addr:x.x.x.x Bcast:x.x.x.x Mask:255.255.255.128
> inet6 addr: xx::xx:xx:xx:xx/64 Scope:Link
谁能解释一下为什么它不选择 ipv6?
我需要在我的主机 (Linux) 上进行任何更改吗?
我已经删除了实际的 ip 详细信息并替换为 xxxx。
【问题讨论】:
-
仅仅因为您的系统上有 IPv6 并不意味着名称“myhost”与 IPv6 地址相关联。这种关联需要在 DNS(网络范围)或
/etc/hosts(仅对本地系统可见)中完成。 -
myhost 只是一个例子......我在那里有不同的机器名称
-
我很清楚“myhost”只是一个例子。但是我所说的关于“myhost”的 DNS/hosts 设置仍然是正确的,即使实际名称不同。
-
@kaps 您是否使用实际主机名,您确定该主机名具有到 ipv6 地址映射,可以解析?
-
@kaps 你的目标是什么?你想解析主机名吗?还是要检索本地 IPv6 地址?
标签: c++ sockets network-programming getaddrinfo