include <netdb.h>
struct hostent *gethostbyname(const char *hostname);//本函数如果调用成功就返回一个指向hostent结构的指针,该结构中含有所查找主机的所有IPv4地址
struct hostent {
char *h_name;
char **h_aliases;
int h_addrtype;
int h_length;
char **h_addr_list;
}
struct hostent *gethostbyaddr(const char *addr, socklen_t len, int family);//本函数返回一个指向与之前所述同样的hosting结构的指针。
struct servent *getservbyname(const char *servname, const char *protoname);//像主机一样,服务也通常靠名字来认知,如果我们在程序代码中通过其名字而不是其端口来指代一个服务,而且从名字到端口号的映射关系保存在在一个文件中(通常是etc/service),那么即使端口号发生变动,我们需要修改的仅仅是etc/service文件中一行而不必重新编译程序,getservtbyname函数用于根据给定名字查找相应的一个服务。
struct servent {
char *s_name;
char **s_aliases;
int s_port; // 网络字节序
char *s_proto;
}
struct servent *getservbyport(int port, const char *protoname);
//getaddrinfo函数,前面的两个gethostbyname和gethostbyaddr仅仅支持ipv4,解析ipv6地址的api经历了若干次反复,最终结果是getaddrinfo函数,这个函数能够处理名字到地址以及服务到端口的两种转换,返回的是一个sockaddr结构而不是地址列表。这些sockaddr结构随后可由套接字函数来直接使用。如此以来,getaddrinfo函数把协议相关性完全隐藏在这个库函数内部。应用程序只需处理由getaddrinfo填写的套接字结构地址
int getaddrinfo(const char *hostname, const char *service, const struct addrinfo *hints, struct addrinfo **result) ;
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;
}
void freeaddrinfo(struct addrinfo *ai);//由getaddrinfo返回的所有存储空间都是动态获取的,这些存储空间通过调用freeaddrinfo返还给系统
浙公网安备 33010602011771号