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