C语言gethostbyname用法及使用inet_ntoa时的一个问题

北战南征 提交于 2020-01-09 20:11:21

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>**头文件,如果不引用,在编译的时候虽然不会出现找不到定义的问题,但是在执行的时候会出现返回时为整形的情况。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!