欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

名字与地址转换

程序员文章站 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*指针,指向相应错误的声明。

 

 

 

 

 

 

相关标签: 网络编程