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

本文介绍了C语言中gethostbyname函数的用法,讲解了如何通过域名获取目标地址,并详细解释了返回结构体的各成员含义。此外,还提到了inet_ntoa函数的使用,强调了在调用该函数时需要包含<arpa/inet.h>头文件以避免执行时出现问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值