参考 《linux网络编程》 宋敬彬 孙海滨 著
通过域名获取主机信息的方法很简单,用函数gethostbyname()就可以。
函数原型如下:
#include <netdb.h>
struct hostent *gethostbyname( const char *name)
gethostbyname()函数返回值是一个指向结构struct hostent 类型变量的指针,为NULL时发生错误。可以用
errno获得。
常见的错误类型如下:
HOST_NOT_FOUND: 查询的主机不可知
NO_ADDRESS , NO_DATA : 请求的名称合法但是没有合适的ip地址
NO_RECOVERY :域名服务器不响应
TRY_AGAIN:域名服务器当前出现临时性错误,稍候再试
结构struct hostent 的原型:
struct hostent
{
char *h_name; // 主机的正式名称
char **h_aliases; //主机别名列表
int h_addrtype; //主机地址类型
int h_length; // 地址长度
char **h_addr_list; //地址列表
}
具体如何获取主机信息代码如下:
我保存为g.c
运行结果如下:
./g www.csdn.net
主机正式名称 :www.csdn.net
主机地址类型:AF_INET
地址长度:4字节
IP:252.16.167.9
由于函数gethostbyname() 不可重入,它传出的值为一块静态的内存地址,当另一次调用后会覆盖前一次。所以每次调用之后必须马上将结果取出,不然会被覆盖。目前gethostbyname()已经不推荐使用,它有了替代函数即getaddrinfo。后者是线程安全的。