从getaddrinfo()的手册页面..。
如果AI_PASSIVE标志未在hints.ai_flags中设置,则返回的套接字地址将适合与connect(2)、sendto(2)或sendmsg(2)一起使用。
但是我要把0.0.0.0还给一些网站。我不应该知道通配符地址吗?
void checkAddresses(char * addrName)
{
struct addrinfo hints;
struct addrinfo * infoptr = 0;
struct addrinfo * node = 0;
int gai_return = 0;
int socket_fd = 0;
int gni_return = 0;
char host_buffer[255] = { 0 };
struct sockaddr_in * h = 0;
memset(host_buffer, 0, sizeof(host_buffer));
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;
hints.ai_flags = 0;
hints.ai_protocol = 0;
hints.ai_canonname = NULL;
hints.ai_addr = NULL;
hints.ai_next = NULL;
gai_return = getaddrinfo(addrName, 0, &hints, &infoptr);
if(gai_return != 0)
{
perror("Getaddrinfo() failure");
exit(1);
}
for (node = infoptr; node != NULL; node = node->ai_next)
{
h = (struct sockaddr_in *) node->ai_addr;
strcpy(host_buffer, inet_ntoa(h->sin_addr));
puts(host_buffer);
}
freeaddrinfo(infoptr);
}发布于 2017-11-04 08:58:00
您指定了AF_UNSPEC,这意味着未指定的地址家族。Now,这意味着您将得到AF_INET和AF_INET6。如果你只想要AF_INET,那么请说出来。
请注意,特别是在查找localhost时,IPv6 address ::1将具有二进制表示形式
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01现在,如果您将前4个字节重新解释为IPv4地址(如果您将指针转换为struct sockaddr_in *).
使用AF_UNSPEC,您必须检查node->ai_family;它将是用于IPv4套接字的AF_INET和用于IPv6的AF_INET6 --可能还有其他的东西。
但是,请注意,大多数情况下,您根本不会检查地址--没有必要。相反,您只需将uncast struct sockaddr *ai_addr以这样的方式传递给sendto (对于UDP套接字)。
https://stackoverflow.com/questions/47109062
复制相似问题