c getaddrinfo函数

系统 2013 0

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

c getaddrinfo函数


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论