名字与地址转换
gethostbyname函数和gethostbyaddr函数
检索主机信息
注意gethostbyname & gethostbyaddr函数已被引入 getaddrinfo 函数弃用。 敦促应用程序的开发人员使用 getaddrinfo 函数而不是 gethostbyname。
#include <netdb.h>//windows是winsock2.h
typedef struct hostent {
char *h_name;//主机 (电脑) 的官方名称。 如果使用 DNS 或类似的解析系统,则它是完全限定的域名 (FQDN) 导致服务器返回答复。 如果使用本地主机文件,则它是 IPv4 地址后的第一个条目。
char **h_aliases;//以 NULL 结尾的备用名称数组。
short h_addrtype;//要返回的地址的类型。
short h_length;//每个地址的长度(以字节为单位)。
char **h_addr_list;//主机地址的 NULL 终止列表。 地址按网络字节顺序返回。 宏 h_addr 定义为h_addr_list[0] 与较旧的软件兼容。(前面是ip地址,后面是主机名)
} HOSTENT, *PHOSTENT, *LPHOSTENT;
//gethostbyname 函数从主机数据库中检索与主机名对应的主机信息。
hostent* gethostbyname(const char *name);
//name:域名(有些版本可以输入点十进制的ip地址)
//gethostbyaddr 函数检索与网络地址对应的主机信息。
struct hostent* gethostbyaddr(const char *addr,int len,int type);
/*
addr:点十进制ip地址
len:地址长度
type:地址类型
*/
//如果未发生任何错误, gethostbyname & gethostbyaddr将返回指向上述主机结构指针。否则,它返回 null 指针,可以通过调用 WSAGetLastError 来检索特定的错误号。
getservbyname & getservbyport
#include <netdb.h>//windows是winsock2.h
servent* getservbyname(const char *name,const char *proto);//检索与服务名称和协议对应的服务信息。
servent* getservbyport(int port,const char *proto);//检索与端口和协议对应的服务信息。
typedef struct servent {
char *s_name; //服务的正式名称。
char **s_aliases; //以 NULL 结尾的备用名称数组。
short s_port; //可以联系服务的端口号。 端口号按网络字节顺序返回。
char *s_proto; //联系服务时要使用的协议的名称。
};
/*
name:指向 null 终止的服务名称的指针。
port:服务端口
proto:指向 以 null 结尾的协议名称的指针。如果此指针为 NULL,
getservbyname 函数将返回第一个服务条目,其中名称与 servicent 结构s_name成员或 servicent 结构的s_aliases成员匹配。 否则, getservbyname 与 名称和proto 匹配。
getservbyport 将返回端口与服务结构s_port匹配的第一个服务条目。 否则, getservbyport 与端口和proto 参数匹配。
返回值:如果未发生错误,getservbyname & getservbyport将返回指向 servent 结构的指针。 否则,它返回 null 指针
*/
getaddrinfo
getaddrinfo 函数提供从 ANSI 主机名到地址的独立于协议的转换。
#include <netdb.h>//windows==ws2tcpip.h
typedef struct addrinfo {
int ai_flags; //指示 getaddrinfo 函数中使用的选项的标志。
int ai_family; //地址类型
int ai_socktype; //套接字类型
int ai_protocol; //协议类型
size_t ai_addrlen; //ai_addr成员指向的缓冲区的长度(以字节为单位)。
char *ai_canonname;//主机的规范名称。
struct sockaddr *ai_addr; //指向 sockaddr 结构的指针。每个返回的addrinfo结构中的ai_addr成员指向填充的套接字地址结构。每个返回的addrinfo结构的长度(以字节为单位)在ai_addrlen成员中指定。
struct addrinfo *ai_next; //指向链接列表中的下一个结构的指针
};
int getaddrinfo(const char *nodename, const char *servicename,const struct addrinfo *hints,struct addrinfo **res);
/*
nodename:该字符串包含主机 (节点) 名称或数字主机地址字符串。
servicename:该字符串包含表示为字符串的服务名称或端口号。
hints:可以是一个空指针,也可以是一个指向某个addrinfo结构的指针,调用者在这个结构中填入关于期望返回的信息类型的暗示。举例来说:如果指定的服务既 支持TCP也支持UDP,那么调用者可以把hints结构中的ai_socktype成员设置成SOCK_DGRAM使得返回的仅仅是适用于数据报套接口 的信息。
res:通过res参数返回一个指向addrinfo结构链表的指针
result value:成功返回0
*/
const char* gai_strerror(int error);//返回一个指出对应错误信息的字符串
void freeaddrinfo(addrinfo* ai);//由于getaddrinfo所返回的res是动态内存分配,所以需要调用该函数释放内存