zoukankan      html  css  js  c++  java
  • Addrinfo and Getaddrinfo

    gethostbyname和gethostbyaddr这两个函数仅仅支持 IPv4,getaddrinfo函数能够处理名字到地址以及服务到端口这两种转换,返回的是一个sockaddr结构的链表而不是一个地址清单。这些 sockaddr结构随后可由套接口函数直接使用。如此以来,getaddrinfo函数把协议相关性安全隐藏在这个库函数内部。应用程序只要处理由 getaddrinfo函数填写的套接口地址结构。该函数在 POSIX规范中定义了。

    #include<netdb.h>
    int getaddrinfo( const char *hostname, const char *service, const struct addrinfo *hints, struct addrinfo **result );
    返回0:  成功
    返回非0:  出错

    hostname: 一个主机名或者地址串(IPv4的点分十进制串或者IPv6的16进制串)
    service:一个服务名或者10进制端口号数串。
    hints: 可以是一个空指针,也可以是一个指向某个addrinfo结构的指针,调用者在这个结构中填入关于期望返回的信息类型的暗示。举例来说:如果指定的服务既 支持TCP也支持UDP,那么调用者可以把hints结构中的ai_socktype成员设置成SOCK_DGRAM使得返回的仅仅是适用于数据报套接口 的信息。

    本函数通过result指针参数返回一个指向addrinfo结构链表的指针,而addrinfo结构定义在头文件 netdb.h中:
    struct addrinfo{
        int       ai_flags;   
        int       ai_family;
        int       ai_socktype;
        int       ai_protocol;
        socklen_t ai_addrlen;
        char    *ai_canonname;
        struct sockaddr *ai_addr;
        struct addrinfo *ai_next;
    };

    如 果本函数返回成功,那么由result参数指向的变量已被填入一个指针,它指向的是由其中的ai_next成员串联起来的addrinfo结构链表。可以 导致返回多个addrinfo结构的情形有以下2个:
        1.    如果与hostname参数关联的地址有多个,那么适用于所请求地址簇的每个地址都返回一个对应的结构。
        2.    如果service参数指定的服务支持多个套接口类型,那么每个套接口类型都可能返回一个对应的结构,具体取决于hints结构的ai_socktype 成员。

    我们必须先分配一个hints结构,把它清零后填写需要的字段,再调用getaddrinfo然后遍历一个链表逐个尝试每个返回地 址。

    getaddrinfo解决了把主机名和服务名转换成套接口地址结构的问题。

    其中,如果getaddrinfo出 错,那么返回一个非0的错误值。

    #include<netdb.h>
    const char *gai_strerror( int error );
    该函数以getaddrinfo返回的非0错误值的名字和含义为他的唯一参数,返回一个 指向对应的出错信息串的指针。

    由getaddrinfo返回的所有存储空间都是动态获取的,这些存储空间必须通过调用 freeaddrinfo返回给系统。
    #include< netdb.h >
    void freeaddrinfo( struct addrinfo *ai );

    ai参数应指向由getaddrinfo返回的第一个addrinfo结构。这个连表中的 所有结构以及它们指向的任何动态存储空间都被释放掉。


    例子:
    struct addrinfo *host_serv( const char *host, const char *serv, int family, int socktype )
    {
        int n;
        struct   addrinfo  hints,  *res;

        bzero( &hints, sizeof(struct addrinfo) );
        hints.ai_flags = AI_CANONNAME;
        hints.ai_family = family;
        hints.ai_socktype = socktype;

        if( (n = getaddrinfo( host, serv, &hints, &res ) ) != 0 )
           return (NULL);

        return ( res );
    }

  • 相关阅读:
    不可小视视图对效率的影响力
    Maximum Margin Planning
    PhysicsBased Boiling Simulation

    Learning Behavior Styles with Inverse Reinforcement Learning
    Simulating Biped Behaviors from Human Motion Data
    Nearoptimal Character Animation with Continuous Control
    Apprenticeship Learning via Inverse Reinforcement Learning
    回报函数学习的学徒学习综述
    Enabling Realtime Physics Simulation in Future Interactive Entertainment
  • 原文地址:https://www.cnblogs.com/hnrainll/p/2182331.html
Copyright © 2011-2022 走看看