函数getaddrinfo在库函数中隐藏了所有协议依赖性。应用 程序只需要处理由getaddrinfo填写的套接口地址结构。其函数原型为:

#include <netdb.h>
int getaddrinfo(const char *hostname, const char *service, const struct addrinfo *hints, struct addrinfo **result);

成功返回0,出错返回非零

这个函数通过result指针返回一个指向addrinfo结构链表的指针,该结构在<netdb.h>中定义:

struct addrinfo
{int ai_flags;// AI_PASSIVE,AI_CANONNAMEint ai_family;//AF_XXXint ai_socktype;//SOCK_XXXint ai_protocol;//0 or IPPROTO_xxx for IPv4 and IPv6size_t ai_addrlen;//length of ai_addrchar *ai_canonname;// ptr to canonical name for hoststruct sockaddr *ai_addr; //ptr to socket address structurestruct addrinfo *ai_next;// ptr to next structure in linked list
};

其中的hostname是主机名或者地址串(IPv4的点分十进制数表示或IPv6的十六进制数串),service是服务名或十进制数的端口号字符串。hints是一个空指针或指向一个addrinfo结构的指针,由调用 者填写关于它所想返回的信息类型的线索。调用 者可以设置的hints结构的成员有:

ai_flags(AI_PASSIVE或AI_CANONNAME)

ai_family

ai_socktype

ai_protocol

AI_PASSIVE标志表示该套接口是被动的打开 ,AI_CANNONAME标志则通知getaddrinfo函数返回主机的名字。如果hints是一个空指针,该函数将假定ai_flags,ai_socktype,ai_protocol的值为零,ai_family的值为AF_UNSPEC

如果函数返回成功(0),result 参数指向的变量将被填入一个指针,它指向一个通过ai_next指针串起来的addrinfo结构链表。

返回这个复合结构有两种方式。

1、如果与该hostname对应的有多个地址,将按请求的地址族(如果指定了ai_family线索)为每个地址返回一个结构

2、如果该服务在多种套接口类型上提供,将根据ai_socktype线索为每个套接口类型返回一个结构

在addrinfo结构中返回的信息可用于调用 socket,然后 调用 connect、sendto(客户)或bind(服务器)。socket函数的参数是addrinfo结构中的ai_family、ai_socktype和ai_addr。connect或bind函数的第二个参数和第三个参数是ai_addr(一个指向适当类型的套接口地址结构的指针,由getaddrinfo)填写和ai_addrlen(套接口地址结构的大小 )。

如果设置 了在hints结构中的AI_CANNONAME标志,返回的第一个结构的ai_canonname成员指向相应主机的名字。

如果枚举getaddrinfo的64种可能的输入(有六个输入变量),许多都 是无效的,有些没什么 意义。因则我们将注意力集中到一些常见情况

1、指定hostname和service.这在TCP或UDP客户程序中很常见。TCP客户程序遍历所有返回的IP地址,逐一调用 socket和connect,直到连接成功或所有地址被试过为止。

在UDP客户程序中,由getaddrinfo填写的套接口地址结构被用来调用 sendto或connect,如果第一个地址不行,就会尝试剩下的地址。

如果客户程序知道它只处理一种类型的口(例如,Telnet和FTP客户程序只处理TCP,TFTP客户程序只处理UDP),就应把hints结构中的ai_socket设为SOCK_STREAM或SOCK_DGRAM

2、典型的服务器程序只用指定service以及hints结构中的AI_PASSIVE标志,而不需要指明hostname.返回的套接口地址结构中应包含一个INADD_ANY或IN6ADDR_ANY_INIT的IP地址。TCP服务器程序随后调用 socket、bind和listen。如果服务器程序要malloc另一个套接口地址结构以从accept取得客户的地址,返回的ai_addrlen的值将给出所需的内存大小 。

UDP的服务器程序将调用 socket、bind和recvfrom。如果服务器要malloc另一个套接口地址结构以从recvfrom取得客户的地址。返回的ai_addrlen的值将给出所需的内存大小 。

和典型的客户程序代码一样,如果服务器程序知道它只处理一种类型的套接口,hints结构中ai_socket应被设为SOCK_STREAM或SOCK_DGRAM。

网络编程学习笔记(getaddrinfo函数)相关推荐

  1. 网络编程学习笔记(shutdown函数)

    终止网络连接的正常方法是close,但close有两个限制,可由shutdown来避免 1.close将描述字的访问计数减1,仅在此计数为0时才关闭套接口.用shutdown可以激发TCP的正常连接终 ...

  2. 网络编程学习笔记(getnameinfo函数)

    这个函数与getaddrinfo互补,它以一个套接口地址为参数,返回一个描述主机的字符串和一个描述服务的字符串.其函数原型如下: #include <netdb.h> int getnam ...

  3. 网络编程学习笔记(udp_client函数)

    创建一个未连接的UDP套接口的客户函数,其代码如下: #include <netdb.h> #include <sys/socket.h> #include <netin ...

  4. 网络编程学习笔记(socketpair函数)

    socketpair函数建立一对相互连接的套接口,这个函数只对Unix域套接口适用,其定义如下: #include <sys/socket.h> int socketpair(int fa ...

  5. 网络编程学习笔记(udp_server函数)

    创建一个UDP口的服务端,其代码如下: #include <netdb.h> #include <sys/socket.h> #include <netinet/in.h ...

  6. 网络编程学习笔记(udp_connect函数)

    创建一个连接UDP套接口的客户端,代码如下: #include <netdb.h> #include <sys/socket.h> #include <netinet/i ...

  7. 网络编程学习笔记(tcp_listen函数)

    执行tcp服务器程序的一般操作步骤:创建一个tcp套接口,给它捆绑服务器众所周知端口,并允许接受外来的连接请求,其代码如下: #include <netdb.h> #include < ...

  8. 网络编程学习笔记(tcp_connect函数)

    执行客户端程序的一般操作步骤,创建一个TCP套接口并与服务器建立连接,其代码如下: #include <netdb.h> #include <netinet/in.h> #in ...

  9. 网络编程学习笔记(freeaddrinfo函数)

    由getaddrinfo返回的存储空间,包括addrinfo结构.ai_addr结构和ai_canonname字符串,都是用malloc动态获取的.这些空间可调用 freeaddrinfo释放.其原型 ...

最新文章

  1. JQuery对checkbox的操作
  2. 创建一个ASP通用分页类(完整版)
  3. Java实现栈(顺序栈,链栈)
  4. java编译找不到符号 int age=in.nexint()_Java报错找不到符号,小白自学求大佬解决...
  5. Memcached学习---(1) 教程
  6. 常用设计模式的小结和实际中的应用
  7. android-25是什么手机,25.手机摄影的20个常用APP
  8. Windows Embedded Compact 7中的进程和线程(上)
  9. 荣耀手机计算机设置功能,荣耀Play手机如何开启USB调试功能和电脑进行连接
  10. 一个程序员的失恋故事
  11. DAS、NAS、SAN三种存储架构比较
  12. 思科交换机指示灯详解
  13. 抖音跳转微信小程序、公众号、个人微信、微信群技术路线
  14. 笔记本键盘两个ctrl键同时失灵怎么解决?
  15. 第一代云原生企业米哈游如何让想象发生?
  16. linux上使用scp命令进行上传和下载
  17. python爬取股市数据
  18. 马化腾和张一鸣的灰度思维:普通人追求安全感,高手拥抱不确定性
  19. 通达信接口编程语言是什么?
  20. Appium 实现iPhone真机自动化-常见问题

热门文章

  1. Oracle WebCenter 11g 快速开发指南--翻译(一)
  2. asp.net + winform + log4net 使用示例|using log4net with asp.net/winform
  3. python语言程序设计基础网课-宜昌2020年_高校邦_Python程序设计基础【实境编程】...
  4. python飞机大战源代码-制作python程序windows安装包(飞机大战源码)
  5. python输入输出-python输入输出及变量
  6. 计算机编程语言python-初学者最容易学的六种编程语言
  7. python爬百度翻译-用python实现百度翻译
  8. python3.8.5怎么用-Python 3.8 新功能大揭秘【新手必学】
  9. python需要学多久才能找到工作-为什么Python适合初学者,一般要学习多久
  10. python导入其他py文件-Python如何import其它.py文件及其函数