名字与地址转换
程序员文章站
2024-02-29 21:21:04
...
概述
常常地,我们都会使用数值地址来表示主机,用数值端口号来标识服务器。然而出于许多理由,我们应该使用名字而不是数值:名字比较容易记住;数值地址可以变动而名字保持不变;随着IPv6上转移,数值地址变得相当长,手工键入数值地址更易出错。本节讲述在名字和数值地址间进行转换的函数:
- 主机名与IPv4地址之间进行转换:gethostbyname 和 gethostbyaddr
- 服务名字和端口号之间进行转换:getservbyname 和 getservbyport
- 用于主机名字和IP地址之间以及服务名字和端口号之间的转换:getaddrinfo 和 getnameinfo
域名系统(DNS)
域名系统(DNS)主要用于主机名字与IP之间的映射。
gethostbyname函数
作用:查找主机名
返回:若成功,则返回一个指向hostent结构的指针,该结构中含有所查找主机的所有IPv4地址
注意:仅仅返回IPv4的地址
#include <netdb.h>
struct hostent* gethostbyname(const char *hostname);
//返回:若成功则为非空指针,若出错则未NULL且设置h_errno
本函数返回的非空指针指向如下的hostent结构:
struct hostent{
char *h_name; //正式主机名,即所查询主机的规范名字
char **h_aliases;
int h_addrtype;
int h_length;
char **h_addr_list;
};
【注】gethostbyname与其他套接字函数不同之处在于:当发生错误时,它不设置errno变量,而是将全局整数变量h_errno设为在头文件<netdb.h>中定义的下列常值之一:
- HOST_NOT_FOUND
- TRY_AGAIN
- NO_RECOVERY
- NO_DATA(等同于NO_ADDRESS)
如今多数解析器提供名为hstrerror的函数,它以某个h_errno值作为唯一的参数,返回的是一个const char*指针,指向相应错误的声明。
下一篇: Redis主从复制的原理