zoukankan      html  css  js  c++  java
  • c getaddrinfo函数

    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

  • 相关阅读:
    mongodb实验
    hbase实验
    oracle数据库的安装
    3ds的fbi无线传输
    2018年春阅读计划---阅读笔记6
    2018年春阅读计划---阅读笔记5
    2018年春阅读计划---阅读笔记4
    php写一个简单的计算器
    2018年春阅读计划---阅读笔记3
    脚本之家的一个meta的帖子
  • 原文地址:https://www.cnblogs.com/helloweworld/p/2684659.html
Copyright © 2011-2022 走看看