【Linux C | 网络编程】gethostbyname 函数详解及C语言例子

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍 gethostbyname 函数 🍭
😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭
⏰发布时间⏰:

本文未经允许,不得转发!!!

目录

  • 🎄一、概述
  • 🎄二、gethostbyname 函数
    • ✨2.1 gethostbyname 函数介绍
    • ✨2.2 hostent 结构体说明
    • ✨2.3 gethostbyname 函数的工作原理
  • 🎄三、gethostbyname 函数使用例子
  • 🎄四、总结


在这里插入图片描述

🎄一、概述

在网络编程中,可能出现这样的情况,你只知道某个服务器的主机名或域名,但不知道其具体的ip地址是什么。例如,你可能知道百度的网址是:www.baidu.com,但不知道其IP地址具体是什么。而gethostbyname可以让我们知道某个网址对应的IP地址,gethostbyname函数是Linux系统中用于获取主机名对应IP地址的函数之一。

使用域名的好处:
1、客户端中直接使用 IP 地址会有很大的弊端,一旦 IP 地址变化(IP 地址会经常变动),客户端软件就会出现错误。
2、名字相对于点分十进制的ip更好记忆。特别是IPv6的ip地址更难记忆。

本文将详细介绍 gethostbyname 函数,并且使用C语言例子演示 gethostbyname 函数的使用。


在这里插入图片描述

🎄二、gethostbyname 函数

✨2.1 gethostbyname 函数介绍

  • 1、函数原型:

    #include <netdb.h>
    extern int h_errno;
    struct hostent *gethostbyname(const char *name);
    
  • 2、函数描述:
    gethostbyname()函数为给定的主机名返回hostent类型的结构。这里的name要么是主机名,要么是标准点表示法的IPv4地址,要么是冒号表示法的IPv6地址(可能还有点)。
    如果name是IPv4或IPv6地址,则不执行任何查找,gethostbyname()只是将name复制到h_name字段中,并将其等效结构in_addr复制到返回的主机结构的h_addr_list[0]字段中。
    如果名称不是以句点结尾,并且设置了环境变量HOSTALIASES,则将首先搜索HOSTALIASES指向的别名文件的名称。除非名称以句点结尾,否则将搜索当前域及其父域。

  • 3、参数、返回值

    • 参数:name,为主机名,也就是域名。使用该函数时,只要传递域名字符串,就会返回域名对应的 IP 地址。返回的地址信息会装入 hostent 结构体。
    • 返回值:成功返回 hostent 结构体指针(看下一小节),失败返回NULL,且设置 h_errno 变量。注意,出错时不设置errno变量,而是设置 h_errno 变量,且提供了hstrerror函数来获取 h_errno 的值对应的字符串。

✨2.2 hostent 结构体说明

hostent结构体定义在 netdb.h 文件中,内容如下:

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 */

在这里插入图片描述
结构体字段说明:

  • h_name:官方域名(Official domain name)。官方域名代表某一主页,但实际上一些著名公司的域名并未用官方域名注册。
  • h_aliases:主机的别名数组,以NULL指针结束,可以通过多个域名访问同一主机。同一 IP 地址可以绑定多个域名,因此除了当前域名还可以指定其他域名。
  • h_addrtype:地址的类型;按照DNS的说法,gethostbyname只能返回IPv4(AF_INET)的地址。
  • h_length:保存IP地址长度。
  • h_addr_list:指向主机IP地址的指针数组(按网络字节顺序),以NULL指针结束。需要通过inet_ntop函数转换。
  • h_addrh_addr_list中第一个地址。

✨2.3 gethostbyname 函数的工作原理

gethostbyname函数的主要功能是根据输入的主机名获取相应的IP地址信息。它通过查询本地主机上的DNS解析器来查找主机名对应的IP地址,并返回一个struct hostent类型的结构体,其中包含有关主机名和IP地址的信息。下面是gethostbyname函数的基本工作流程:

  • 1、接受一个主机名作为参数。
  • 2、首先检查本地主机上的hosts文件,如果找到匹配的主机名,则返回相应的IP地址。
  • 3、如果未找到匹配项,gethostbyname会向DNS服务器发送查询请求,以获取主机名对应的IP地址。
  • 4、最终,函数返回一个包含主机名和IP地址信息的struct hostent结构体。

在这里插入图片描述
一般,在Linux系统中存在一个静态主机文件/etc/hosts。而文件/etc/resolv.conf通常包含本地名字服务器主机的IP地址。


在这里插入图片描述

🎄三、gethostbyname 函数使用例子

// gethostbyname_sample.c
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
 
extern int h_errno;
 
int main(int argc, char **argv)
{
    if (argc != 2) {
        printf("Use example: %s www.google.com\n", *argv);
        return -1;
    }
 
    char	*name = argv[1], **pptr;
    char	str[INET_ADDRSTRLEN];
    struct hostent *hptr = gethostbyname(name);
    if (hptr == NULL) {
        printf("gethostbyname error for host: %s: %s\n", name, hstrerror(h_errno));
        return -1;
    }
    
    printf("\tofficial: %s\n", hptr->h_name);//输出主机的规范名
 
    for (pptr=hptr->h_aliases; *pptr!=NULL; pptr++) {
        printf("\ttalias: %s\n", *pptr); //输出主机的别名
    }
 
    //输出ip地址
    switch (hptr->h_addrtype) {
        case AF_INET:
            for (pptr=hptr->h_addr_list; *pptr!=NULL; pptr++) {
                printf("\taddress: %s\n",
                        inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str)));
            }
            break;
        default:
            printf("unknown address type\n");
            break;
    }
 
    return 0;
}

运行结果:
下面是分别查询www.baidu.com(百度)、www.goolge.com(谷歌)、localhost(本地主机名)的打印结果。
在这里插入图片描述

nslookup命令是Ubuntu自带的查询域名的工具,下面是使用nslookup命令的打印,可以看到获取的主要内容和上面一致:
在这里插入图片描述


在这里插入图片描述

🎄四、总结

👉本文主要介绍将域名转换为IP地址的函数gethostbyname,以及提供使用例子。

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

参考资料:
1、Linux的man手册
2、《Unix网络编程卷1》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/416843.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软考-系统集成项目管理中级-信息系统建设与设计

本章重点考点 1.信息系统的生命周期 信息系统建设的内容主要包括设备采购、系统集成、软件开发和运维服务等。信息系统的生命周期可以分为四个阶段:立项、开发、运维和消亡。 2.信息系统开发方法 信息系统常用的开发方法有结构化方法、原型法、面向对象方法等 1)结构化方法 …

VS连接MySQL以及找不到libmysql.dll的解决方法

VS连接数据库需要在项目中进行配置&#xff0c;具体可见 https://blog.csdn.net/weixin_40582034/article/details/115562097?ops_request_misc%257B%2522request%255Fid%2522%253A%2522170891897216800213058288%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522…

前端开发——ElementUI组件的使用

文章目录 1. Tabs标签页2. 单选框 el-radio3. 复选框 el-checkbox4. 下拉框 el-select5. 表格 el-table6. 对话框 el-dialog7. 文字提示 el-tooltip8. 抽屉 el-drawer 1. Tabs标签页 <template><el-tabs v-model"activeName" tab-click"handleClick&q…

linux操作docker

docker地址 官方地址 centos7安装docker 卸载旧版本docker sudo //在前面表示以管理员权限操作yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine安装docker //安装所需资…

综合实战(volume and Compose)

"让我&#xff0c;重获新生~" MySQL 灾难恢复 熟练掌握挂载卷的使用&#xff0c;将Mysql的业务数据存储在 外部。 实战思想: 使用 MySQL 5.7 的镜像创建容器并创建一个普通数据卷 "mysql-data"用来保存容器中产生的数据。我们需要容器连接到Mysql服务&a…

流水账-20240229

目录 git本地回滚到到120bc409ee3b8f63a23d0060e55118bcce557acf提交记录本地提交到已有代码分支 IDEA批量导入快捷键无效更换背景主题快捷键快捷键可以设置eclipse模式&#xff0c;但是有些不生效&#xff0c;可能是冲突了Ctrl单击&#xff0c;Eclipse里面是可以跳转到代码内部…

数仓项目6.0(二)数仓

中间的几步意义就在于&#xff0c;缓存中间处理数据样式&#xff0c;避免重复计算浪费算力 分层 ODS&#xff08;Operate Data Store&#xff09; Spark计算过程中&#xff0c;存在shuffle的操作&#xff0c;而shuffle会将计算过程一分为二&#xff0c;前一阶段不执行完&…

单点登录的三种方式

前言 在B/S系统中&#xff0c;登录功能通常都是基于Cookie 来实现的。当用户登录成功后&#xff0c;一般会将登录状态记录到Session中&#xff0c;或者是给用户签发一个 Token&#xff0c;无论哪一种方式&#xff0c;都需要在客户端保存一些信息(Session ID或Token)&#xff0…

Leetcode股票问题总结篇!

Leetcode股票问题总结篇! https://programmercarl.com/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92-%E8%82%A1%E7%A5%A8%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93%E7%AF%87.html#%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BA 卖股票的最佳时机 买卖股票…

网络工程师笔记5

TCP/IP 常见协议 应用层 Telnet 数据网络中提供远程登录服务的标准协议23FTP 传输文件协议21&#xff0c;20HTTP 超文本传输协议80TFTPSNMPSMTPDNSDHCP 传输层 TCPUDP 网络层 ICMPIGMPIP 数据链路层 PPPOE Internet PPP 传输层 传输层协议接收…

AI智能分析网关V4智慧商场方案,打造智慧化商业管理生态

AI智能视频检测技术在商场楼宇管理中的应用越来越广泛。通过实时监控、自动识别异常事件和智能预警&#xff0c;这项技术为商场管理提供了更高效、更安全的保障。今天我们以TSINGSEE青犀视频AI智能分析网关为例&#xff0c;给大家介绍一下AI视频智能分析技术如何应用在商场楼宇…

web组态(BY组态)接入流程

技术文档 官网网站&#xff1a;www.hcy-soft.com 体验地址&#xff1a; www.byzt.net:60/sm 一、数据流向图及嵌入原理 数据流向 嵌入原理 二、编辑器调用业务流程图 三、集成前需要了解的 1、后台Websocket端往前台监控画面端传输数据规则 后台websocket向客户端监控画面…

最新 PhpStorm 2023.3.4 下载与安装 + 永久免费

文章目录 Stage 1 : 官网下载Stage 2 : 下载工具Stage 3-1 : windows为例Stage 3-2 : mac为例常见问题部分小伙伴 Mac 系统执行脚本遇到如下错误&#xff1a;解决方法&#xff1a; Stage 1 : 官网下载 先去官网下载 我这里下载的是最新版本的2023.3.4&#xff0c;测试过2023最…

就业班 2401--2.28 Linux Day7--存储管理1

一 .存储管理 主要知识点: 基本分区、逻辑卷LVM、EXT3/4/XFS文件系统、RAID 初识硬盘 机械 HDD 固态 SSD SSD的优势 SSD采用电子存储介质进行数据存储和读取的一种技术&#xff0c;拥有极高的存储性能&#xff0c;被认为是存储技术发展的未来新星。 与传统硬盘相比&#…

使用Fragments(片段)提升你的Vue.js开发体验

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Windows系统安装TortoiseSVN并结合内网穿透实现远程访问本地服务器——“cpolar内网穿透”

文章目录 前言1. TortoiseSVN 客户端下载安装2. 创建检出文件夹3. 创建与提交文件4. 公网访问测试 前言 TortoiseSVN是一个开源的版本控制系统&#xff0c;它与Apache Subversion&#xff08;SVN&#xff09;集成在一起&#xff0c;提供了一个用户友好的界面&#xff0c;方便用…

C++:模版初阶 | STL简介

创作不易&#xff0c;感谢支持&#xff01;&#xff01; 一、泛型编程思想 如何实现一个通用的交换函数呢&#xff1f; 注&#xff1a;其实swap函数在C的标准库提供了&#xff0c;不需要自己写&#xff0c;这边只是举个例子 void Swap(int& left, int& right) { in…

【MATLAB源码-第149期】基于MATLAB的2ASK,2FSK,2PSK,2DPSK等相干解调仿真,输出各节点波形。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 2ASK&#xff08;二进制幅移键控&#xff09;、2FSK&#xff08;二进制频移键控&#xff09;、2PSK&#xff08;二进制相移键控&#xff09;和2DPSK&#xff08;二进制差分相移键控&#xff09;是数字调制技术中的基本调制方…

《C++ Primer Plus》《10、对象和类》

文章目录 前言&#xff1a;1 过程性编程和面向对象编程2 抽象和类2.1 类型是什么2.2 C中的类2.3 实现类成员函数2.4 使用类 3 类的构造函数和析构函数3.1 声明和定义构造函数3.2 使用构造函数3.3 默认构造函数3.4 析构函数 4 this指针5 对象数组6 类的作用域6.1 作用域为类的常…

初始化vue3(构建、配置)

白弟的记性不好&#xff0c;正所谓好记性不如烂笔头&#xff0c;还是把一些知识写下来更好&#xff0c;这一篇文章主要讲的就是初始化vue3项目的一些常规的配置&#xff0c;自动化部署在另一篇文章&#xff0c;大家可以自行查阅。 一、项目初始化&#xff08;用的vite2&#xf…
最新文章