博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
gethostbyname, gethostbyaddr, getaddrinfo
阅读量:4285 次
发布时间:2019-05-27

本文共 1769 字,大约阅读时间需要 5 分钟。

  • gethostbyname()函数

    1. 原型:#include <netdb.h>
    2.       struct hostent *gethostbyname(const char *hostname);
        该函数是查找主机名最基本的函数。如果调用成功了,他就返回一个指向hostent结构的指针,该结构中含有所查找主机的所有IPv4地址。这个函数的局限是只能返回IPv4地址。POSIX、规范预警可能会在将来的某个版本中撤销gethostbyname函数。该函数在执行时可能会阻塞,也就是说他是以同步的方式工作的。

  • gethostbyaddr函数

    gethostbyaddr函数试图由一个二进制的IP地址找到响应的主机名,与gethostbyname的行为正好相反。其原型如下:

    1. #include <netdb.h>
    2. struct hostent* gethostbyaddr(const char *addr, socklen_t len, 
                                    int family);
        本函数返回一个同样指向hostent结构的指针。addr参数实际上不是char *类型,而是一个指向存放IPv4地址的某个in_addr结构的指针;len参数是这个结构的大小:对于IPv4地址为4。family参数是AF_INET。 该函数在执行时可能会阻塞,也就是说他是以同步的方式工作的。

  • getaddrinfo函数

        前面两个函数仅仅支持IPv4,为了解决IPv6的情形,POSIX增加了getaddrinfo函数。getinfoaddr函数能够处理名字到地址及服务到端口这两种转换,返回的是一个sockaddr结构的链表而不是一个地址清单。这些sockaddr结构随后可由套接口直接使用。如此一来,getaddrinfo函数把协议相关性完全隐藏在这个库内部。应用程序只需要处理由getaddrinfo填写的套接口地址结构。该函数在POSIX规范中定义。其原型如下:

    1. #include <netdb.h>
    2. int getaddrinfo(const char *hostname, const char *service, 
                      const struct addrinfo *hints, 
                      struct addrinfo **result);
        其中hostname参数是一个主机名或地址串(IPv4的点分十进制数串或IPv6的十六进制数串)。service参数是一个服务名或十进制端口号数串。hints参数可以是一个空指针,也可以是一个指向某个addrinfo结构的指针,调用者在这个结构中填入关于期望返回的信息类型的暗示。举例来说,如果指定的服务既支持TCP也支持UDP,那么调用者可以把hints结构中的ai_socktype成员设置成SOCK_DGRAM,是的返回的仅仅是适用于数据包套结构的信息。如果hints参数是一个空指针,本函数就假设addrinfo结构中的ai_flag,ai_socktype和ai_protocol的值均为0,ai_family的值为AF_UNSPEC。

        如果函数返回成功(0),那么由result参数指向的变量已被填入一个指针,它指向的是由其中的ai_next成员串接起来的addrinfo结构链表。同样, 该函数在执行时可能会阻塞,也就是说他是以同步的方式工作的。 可导致返回多个addrinfo结构的情形有以下两个:

    • 如果与hostname参数关联的地址有多个,那么适用于所请求地址族(可通过hints结构的ai_family成员设置)的每个地址都返回一个对应的结构。

    • 如果service参数指定的服务支持多个套接口类型,那么每个套接口类型都可能返回一个对应的结构,具体取决于hints结构的ai_socktype成员。(注意:getaddrinfo的多数实现认为只能按照由ai_socktype成员请求的套接口类型端口号数串到端口的转换,如果没有指定这个成员,就返回一个错误。)

    可以看出,以上的函数都是以同步的方式完成域名解析的。那么,若是将其使用在对性能要求比较高的网络服務器程序中的话,可能会因为它们的阻塞执行行为而导致程序的服务能力大打折扣。那么,在这种情况下我们迫切需要一种能够异步执行域名解析的技术,来解决同步方式的性能问题!

ref 

转载地址:http://sxsgi.baihongyu.com/

你可能感兴趣的文章
matlab中的并行方法与理解(2):parfor中的变量类型
查看>>
CentOS 7 命令行模式安装teamviewer13
查看>>
teamviewer Linux centos7安装使用详细
查看>>
【MATLAB】线条标记符大小设置
查看>>
MATLAB中矩阵的逻辑索引方法
查看>>
windows下go dep环境搭建
查看>>
EMQX docker安装及运行
查看>>
使用python和MQTT.fx连接mqtt
查看>>
EMQTT的ACL鉴权(topic权限控制)
查看>>
emqx客户端用户名密码登录验证配置
查看>>
python多线程之信号量semaphore实战
查看>>
ubuntu下忘记mysql密码重置方式
查看>>
ubuntu不在python虚拟环境下使用uwsgi启动django及nginx代理配置
查看>>
flask ORM之SQLAlchemy基本架构实战
查看>>
Python2和python3中类型判断
查看>>
Centos 7上搭建flask项目实战
查看>>
搭建nginx+uwsgi+flask遇到KeyError: 'REQUEST_METHOD'
查看>>
Nginx+uwsgi+flask部署实战
查看>>
UnicodeDecodeError: 'gbk' codec can't decode byte 0xa6 in position 9737: illegal multibyte sequence
查看>>
python中导入 train_test_split提示错误
查看>>