c getaddrinfo函数
	
		
		系统
		
		2536 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元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。
					
						【本文对您有帮助就好】元