网络编程学习笔记(getaddrinfo函数)
2014-10-08 22:14
344 查看
函数getaddrinfo在库函数中隐藏了所有协议依赖性。应用 程序只需要处理由getaddrinfo填写的套接口地址结构。其函数原型为:
成功返回0,出错返回非零
这个函数通过result指针返回一个指向addrinfo结构链表的指针,该结构在<netdb.h>中定义:
其中的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。
#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_CANONNAME int ai_family;//AF_XXX int ai_socktype;//SOCK_XXX int ai_protocol;//0 or IPPROTO_xxx for IPv4 and IPv6 size_t ai_addrlen;//length of ai_addr char *ai_canonname;// ptr to canonical name for host struct sockaddr *ai_addr; //ptr to socket address structure struct 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。
相关文章推荐
- Java 网络编程 TCP vs UDP -Java学习笔记(31)
- Java学习笔记(七、网络编程基础)
- Java学习笔记之网络编程基础-通过URLConnection获取HTML页面
- 孙鑫VC学习笔记:第十四讲 网络编程
- [Linux网络编程学习笔记]索引
- 孙鑫VC学习笔记:第十四讲 (二) 网络编程
- 学习笔记--网络编程
- Java学习笔记之网络编程基础-根据域名自动到DNS上获取IP地址
- [Linux网络编程学习笔记]套接字地址结构
- C#网络编程学习笔记1
- 《Web Service 编程 --用C#.NET 开发网络服务》北京希望出版社 我的学习笔记(第二章)(也就是书上抄了一写东西而已)
- 《Web Service 编程 --用C#.NET 开发网络服务》北京希望出版社 我的学习笔记(第一章)(也就是书上抄了一写东西而已)
- Java 网络编程 学习笔记一 基础知识
- Java网络编程---I/O部分学习笔记整理
- 网络编程学习笔记
- java NIO非阻塞式IO网络编程学习笔记(一)
- [原]Linux网络编程学习笔记
- [Linux网络编程学习笔记]管道的创建和使用
- [零散篇]Java学习笔记---Java的Socket网络编程以及多线程
- Java学习笔记之网络编程基础-通过URL获取网络图片