Linux网络编程C语言域名解析

视频连接

head

end

/******* 域名解析 **************************
 * 函数名:struct hostent *gethostbyname(const char *name);
 * 功能:域名解析
 * 参数:
 *    const char *name:域名或者ip
 * 返回值:struct hostent *
 *      成功:返回数据结构体
 *      失败:NULL
 * ***************************************/

/********释放解析后的数据空间******************
 * 函数名:void endhostent(void);
 * 功能:释放gethostbyname函数申请的空间
 * 参数:无
 * 返回值:无
 * ****************************************/

#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
    if (argc != 3)
    {
        printf("参数错误:./程序名称 ip地址或者域名 端口号\n");
        return 0;
    }

    for (int i = 0; i < argc; i++)
    {
        printf("参数[%d] = %s\n", i, argv[i]);
    }

    printf("打印解析数据:\n");

    struct hostent *hs = gethostbyname(argv[1]);
    if (hs == NULL)
    {
        perror("获取失败:");
        exit(0);
    }

    

    printf("主机正式名称:%s\n", hs->h_name);
    char *type_name = NULL;
    for (int i = 0; hs->h_aliases[i] != NULL; i++)
    {
        printf("别名[%d]列表:%s\n", i,hs->h_aliases[i]);
    }
    
    printf("址的长度:%d\n", hs->h_length);
    char *ip = NULL;
    //将网络大端字节序的ip转为字符点分形式
    for (int i = 0; hs->h_addr_list[i] != NULL; i++)
    {
        ip = inet_ntoa(*(struct in_addr *)hs->h_addr_list[i]);
        printf("地址[%d]:%s\n", i, ip);
    }

    //输出ip地址

    
    //释放我转换的数据信息
    endhostent();
    return 0;
}

// struct hostent   //只支持IPv4
// {
//     char *h_name;       /* 主机正式名称 */
//     char **h_aliases;   /* 别名列表 */
//     int h_addrtype;     /* 主机地址类型 */
//     int h_length;       /* 地址的长度 */
//     char **h_addr_list; /* 地址列表 */
// }
//#define h_addr h_addr_list[0] /* 为了向后兼容 */

 

posted @ 2021-12-04 21:50  王廷胡_白嫖帝  阅读(347)  评论(0编辑  收藏  举报