IPv4中使用gethostbyname()函数完成主机名到地址解析,这个函数仅仅支持IPv4,且不允许调用者指定所需地址类型的任何信息,返回的结构只包含了用于存储IPv4地址的空间。IPv6中引入了getaddrinfo()的新API,它是协议无关的,既可用于IPv4也可用于IPv6。getaddrinfo函数能够处理名字到地址以及服务到端口这两种转换,返回的是一个addrinfo的结构(列表)指针而不是一个地址清单。这些addrinfo结构随后可由套接口函数直接使用。如此以来,getaddrinfo函数把协议相关性安全隐藏在这个库函数内部。应用程序只要处理由getaddrinfo函数填写的套接口地址结构。该函数在 POSIX规范中定义了。
1
|
|
/* 头文件: linux下#include <netdb.h> windows下#include<ws2tcpip.h> 原型: int getaddrinfo( const char *hostname, const char *service, const struct addrinfo *hints, struct addrinfo **result ); 功能: 能够处理名字到地址以及服务到端口这两种转换。 参数: hostname——一个主机名或者地址串(IPv4的点分十进制串或者IPv6的16进制串); service——十进制的端口号,或者已定义的服务名称如ftp、http等; hints——可以是空指针,也可以是一个指向某个addrinfo结构体的指针,设置该参数以获得期望返回的信息类型; result——本函数通过result指针返回一个指向addrinfo结构体链表的指针。 返回值: 0——成功,非0——出错。 */ |
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
|
/* name:getaddrinfo.c */
#include <stdio.h> #include <stdlib.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <string.h> int main(int argc, char **argv) { /*判断命令行参数个数*/ if (argc != 2) { fprintf(stderr, "Usage: %s hostname\n",argv[0]); exit(1); } struct addrinfo *result, hint, *pointToResult; char ipAddr[16]; int returnValue; bzero(&hint, sizeof(hint)); /*设置hint以获取期望的类型*/ hint.ai_family = AF_INET; hint.ai_socktype = SOCK_STREAM; returnValue = getaddrinfo(argv[1], NULL, &hint, &result); /*是否成功获得信息*/ if (returnValue != 0) { fprintf(stderr, "getaddrinfo: &s\n", gai_strerror(returnValue)); exit(1); } /*将获得的地址以表达格式输出*/ for (pointToResult = result; pointToResult != NULL; pointToResult = pointToResult->ai_next) { inet_ntop(AF_INET, &(((struct sockaddr_in *)(pointToResult->ai_addr))->sin_addr), ipAddr, 16); printf("%s\n", ipAddr); } freeaddrinfo(result); exit(0); }
/* 输入: ./getaddrinfo ubuntu
输出:
127.0.0.1 127.0.1.1 192.168.77.172
*/
|
参考:
http://www.cnblogs.com/cxz2009/archive/2010/11/19/1881693.html
相关函数:
gethostbyname
gethostbyaddr
getservbyport
getservbyname
getaddrinfo
getnameinfo