gethostbyname 用法
众所周知我们可以使用gethostbyname方法通过域名获取目标地址。
struct hostent {
char *h_name; /* official name of host */
char **h_aliases; /* alias list */
int h_addrtype; /* host address type */
int h_length; /* length of address */
char **h_addr_list; /* list of addresses */
}
#define h_addr h_addr_list[0] /* for backward compatibility */
struct hostent *gethostbyname(const char *name);
通过该函数可以返回一个包含域名服务器地址信息的结构体。下面的代码说明一下用法。
#include <stdio.h>
#include <netdb.h>
#include <arpa/inet.h>
#define URL "blog.csdn.net"
int main()
{
int i = 0;
int fd = 0;
struct sockaddr_in serverAddr;
struct hostent *st_host;
st_host = gethostbyname(URL);
if (st_host == NULL) {
printf("get host by name err\n");
return;
}
printf("name : %s\n", st_host->h_name);
for(i=0; st_host->h_addr_list[i]; i++) {
printf("alias[%d] : %s\n", i, st_host->h_aliases[i]);
}
printf("addrtype : %d\n", st_host->h_addrtype);
printf("addr len : %d\n", st_host->h_length);
for(i=0; st_host->h_addr_list[i]; i++) {
printf("addr[%d] : %s\n", i, inet_ntoa(*(struct in_addr*)(st_host->h_addr_list[i])));
}
}
输出:
name : f32ntumnfh53rmbfkgfrhzcp2sn0rrjh.yundunwaf1.com
alias[0] : blog.csdn.net
addrtype : 2
addr len : 4
addr[0] : 39.96.126.153
下面说明一下返回的结构体的各个含义。
h_name:官方域名(Official domain name)。官方域名代表某一主页,但实际上一些著名公司的域名并未用官方域名注册。
h_aliases:别名,可以通过多个域名访问同一主机。同一 IP 地址可以绑定多个域名,因此除了当前域名还可以指定其他域名。
h_addrtype:gethostbyname() 不仅支持 IPv4,还支持 IPv6,可以通过此成员获取IP地址的地址族(地址类型)信息,IPv4 对应 AF_INET,IPv6 对应 AF_INET6。
h_length:保存IP地址长度。IPv4 的长度为 4 个字节,IPv6 的长度为 16 个字节。
h_addr_list:这是最重要的成员。通过该成员以整数形式保存域名对应的 IP 地址。对于用户较多的服务器,可能会分配多个 IP 地址给同一域名,利用多个服务器进行均衡负载。
inet_ntoa使用时的一个问题
这个函数在调用的时候需要引用**#include <arpa/inet.h>**头文件,如果不引用,在编译的时候虽然不会出现找不到定义的问题,但是在执行的时候会出现返回时为整形的情况。
来源:CSDN
作者:gaorx1019
链接:https://blog.csdn.net/gaorx1019/article/details/103913189