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

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

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

目录

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


在这里插入图片描述

🎄一、概述

上篇文章介绍了 gethostbyname 函数,可以通过域名来获取到域名对应的IP地址。本文将介绍另一个函数 gethostbyaddr,它的功能与 gethostbyname 函数正好相反,可以通过二进制的IP地址找到相应的主机名。

下面将详细介绍 gethostbyaddr 函数,并且使用C语言例子演示 gethostbyaddr 函数的使用。


在这里插入图片描述

🎄二、gethostbyaddr 函数

✨2.1 gethostbyaddr 函数介绍

  • 1、函数原型:
    #include <netdb.h>
    #include <sys/socket.h>       /* for AF_INET */
    struct hostent *gethostbyaddr(const void *addr, socklen_t len, int type);
    
  • 2、函数描述:
    gethostbyaddr函数可以获取到指定的主机地址addr对应的主机信息,并通过struct hostent *返回。
  • 3、函数参数:
    • addr:参数addr不是void*类型, 而是一个真正指向含有IPv4或IPv6地址的结构in_addrin6_addr
    • len:第一个参数的结构大小,对于 IPv4地址为4,对于IPv6地址为16;
    • type:协议族类型,IPv4用AF_INET,IPv6用AF_INET6
  • 4、返回值:
    成功返回 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的说法,gethostbyaddr只能返回IPv4(AF_INET)的地址。
  • h_length:保存IP地址长度。
  • h_addr_list:指向主机IP地址的指针数组(按网络字节顺序),以NULL指针结束。需要通过inet_ntop函数转换。
  • h_addrh_addr_list中第一个地址。

✨2.3 gethostbyaddr 函数的工作原理

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

  • 1、接受一个指向 struct in_addr 类型的 IP 地址结构体的指针作为参数。
  • 2、向 DNS 服务器发送查询请求,以获取该 IP 地址对应的主机名。
  • 3、返回一个包含主机名和IP地址信息的 struct hostent 结构体。

在这里插入图片描述

🎄三、gethostbyaddr 函数使用例子

// gethostbyaddr_sample.c
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>int main(int argc, char **argv)
{if (argc != 2) {printf("Use example: %s 127.0.0.1\n", *argv);return -1;}char *ptr, **pptr;struct in_addr addr;struct hostent *phost;char str[32] = {0};ptr = argv[1];printf("ip:%s\n", ptr);if (inet_pton(AF_INET, ptr, &addr) <= 0) {printf("inet_pton error:%s\n", strerror(errno));return -1;}phost = gethostbyaddr((const char*)&addr, sizeof(addr), AF_INET);if (phost == NULL) {printf("gethostbyaddr error:%s\n", strerror(h_errno));return -1;}	printf("official hostname:%s\n", phost->h_name);   	//主机规范名return 0;
}

运行结果:
在这里插入图片描述


在这里插入图片描述

🎄四、总结

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

通过本文的介绍,我们详细了解了 Linux 系统中 gethostbyaddr 函数的定义和使用场景。gethostbyaddr 函数在网络编程中具有重要意义,帮助开发人员根据 IP 地址查询对应的主机名,从而支持各种网络应用和通信需求。希望本文能够帮助您更好地理解并应用 gethostbyaddr 函数。

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaSE面试——hashcode和equals

对象调用 hashCode 方法后&#xff0c;会返回一串 int 类型的数字码 java 规定&#xff1a; 1. 两个对象的 hashCode() 相等&#xff0c;那他们的 equals() 不一定相等 2. 两个对象的 equals() 相等&#xff0c;那他们的 hashCode() 必定相等 3. 重写 equals() 方法时一定要…

三天学会阿里分布式事务框架Seata-SpringCloud Alibaba分布式基础案例搭建

锋哥原创的分布式事务框架Seata视频教程&#xff1a; 实战阿里分布式事务框架Seata视频教程&#xff08;无废话&#xff0c;通俗易懂版&#xff09;_哔哩哔哩_bilibili实战阿里分布式事务框架Seata视频教程&#xff08;无废话&#xff0c;通俗易懂版&#xff09;共计10条视频&…

日志到filebeat-->logstash-->elastic-->kibana

1、日志到filebeat。 cat /etc/filebeat/filebeat.yml filebeat.inputs: - type: syslog format: rfc3164 protocol.udp: host: "0.0.0.0:514" output.logstash: hosts: ["localhost:5044"] 验证方式: tcpdump -i 网卡名称 udp port 514 2、…

瑞吉苍穹外卖如何拓展?已经经过不同公司多轮面试。项目中会问到哪些问题?以及问题如何解决?

别催了&#xff0c;别催了&#xff0c;先收藏吧。 作者大大正在加班加点完成。 文章会尽快发布&#xff0c;关注收藏&#xff0c;尽请期待。 想要加入并查阅作者的知识库可以联系作者 不要白嫖&#xff0c;通过后&#xff0c;附上关注和收藏截图。 已有众多小伙伴加入 目前…

QtCreator报Failed to parse qmlimportscanner output解决

错误如下: 定位错误位置 增加错误信息打印 打印执行命令 执行打印输出的命令,成功返回JSON 但输出的JSON对象不是json格式,而是命令 增加$$成功输出JSON 使用QtCreator12编译一次后,再使用QtCreator13成功编译通过,问题解决

初学者如何使用QT新建一个包含UI界面的C++项目

文章目录 一、下载并安装QT51、下载安装包2、注册/登录账号3、安装qt6 二、新建QT Widget项目1、新建项目并且运行2、易错点&#xff1a;可能运行成功得到UI界面但是会报错&#xff08;原因是使用了中文路径&#xff09; 一、下载并安装QT5 1、下载安装包 进入下载网址 Windo…

面试经典150题【41-50】

文章目录 面试经典150题【41-50】49.字母异位词分组1. 两数之和202.快乐数219. 存在重复元素II128.最长连续序列228. 汇总区间56.合并区间&#xff08;华为面试题&#xff09;57.插入区间452.用最少的箭引爆气球20.有效的括号 面试经典150题【41-50】 49.字母异位词分组 用这种…

TensorBoard的使用,add_image()的使用。

在TensorBoard中&#xff0c;add_image()函数用于将图像数据添加到可视化中。它可以用于显示模型输入、输出、中间特征图等图像数据&#xff0c;以帮助开发者理解模型的运行情况。 add_image()的用法&#xff1a; 使用ctrl点击add_image() 注意&#xff1a;图片类型要求为 t…

机器学习笔记 YOLOv9模型相关论文简读

一、YOLOv9简述 自 2015 年 Yolov1 推出以来,已经出现了多个版本。 基于Darknet的YOLOv2、YOLOv3和YOLOv4 YOLOv5 YOLOv8 基于 Ultralytics。 SCALED-YOLOv4 使用 Pytorch 而不是 Darknet。 YOLOR是YOLOv4的改进。 YOLOX是YOLOv3的改进。 YOLOv6专注于工业应用。 YOLOv7 来自 …

哇去,有了这篇文章,项目中引入了再多的字体包,我都不怕了!!!

通常情况下&#xff0c;我们在开发一个新项目的时候&#xff0c;项目那边通常都会提供一些项目所需的字体包&#xff0c;来满足项目对字体展示的特殊需求。 这部分大家都比较熟悉&#xff0c;就不详细讲了&#xff0c;直接上代码&#xff1a; /* 引入字体包 */ font-face {fo…

异常处理(黑马学习笔记)

当前问题 登录功能和登录校验功能我们都实现了&#xff0c;下面我们学习下今天最后一块技术点&#xff1a;异常处理。首先我们先来看一下系统出现异常之后会发生什么现象&#xff0c;再来介绍异常处理的方案。 我们打开浏览器&#xff0c;访问系统中的新增部门操作&#xff0…

模型优化_如何提高网络/模型的泛化能力?(全面)

目录 1. 以数据为中心的泛化方法 1.1 使用更多数据 1.2 做好数据预处理 特征工程 1.3 数据增强 1.4 调整数据分布 2. 以模型为中心的泛化方法 2.1 使用更大批次 超参数调优 2.2 调整目标函数 2.3 调整网络结构 2.4 屏蔽网络节点 2.5 权值正则化 2.6 偏差-方差权衡…

全国夜间灯光指数数据、GDP密度分布、人口密度分布、土地利用数据、降雨量数据

引言 DMSP/OLS的1992-2013年全球遥感影像&#xff0c;包括三种非辐射定标的夜间灯光影像。三种全年平均影像分别是&#xff1a;无云观测频数影像、平均灯光影像和稳定灯光影像。目前地理遥感生态网可提供全国稳定灯光影像免费下载。稳定灯光影像是标定夜间平均灯光强度的年度栅…

【论文阅读笔记】Explicit Visual Prompting for Low-Level Structure Segmentations

1.介绍 Explicit Visual Prompting for Low-Level Structure Segmentations 低级结构分割的显式视觉提示 2023年发表在IEEE CVPR Paper Code 2.摘要 检测图像中低级结构&#xff08;低层特征&#xff09;一般包括分割操纵部分、识别失焦像素、分离阴影区域和检测隐藏对象。虽…

人造太阳光热模拟能量密度太阳模拟器

人造太阳模拟器其他名称&#xff1a;能量密度太阳能光热模拟能量密度太阳模拟器、能流密度太阳光模拟器、高通量太阳模拟器 高通量能留密度太阳能炉和太阳光模拟器产生高度集中的太阳能和人造光&#xff0c;用于新技术和材料的研究和测试。这使研究人员能够进行制氢实验、太阳…

备战蓝桥杯---线段树基础1

引入&#xff1a;RMQ问题&#xff1a; 什么是RMQ&#xff1f; 显然&#xff0c;我们无法用前缀维护&#xff0c;因此&#xff0c;我们需要用到线段树的知识&#xff1a; 什么是线段树&#xff1f; 线段树是用一种树状结构存储一个连续区间信息的数据结构 下面我们用图解释用…

【数据结构】队列OJ题《用队列实现栈》(题库+解析+代码)

1.前言 通过前面队列的实现和详解大家对队列应该有一定熟悉了&#xff0c;现在上强度开始做题吧 队列详解&#xff1a;http://t.csdnimg.cn/dvTsW 2.OJ题目训练225. 用队列实现栈 题目分析 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0…

【GPU驱动开发】- AST简介

前言 不必害怕未知&#xff0c;无需恐惧犯错&#xff0c;做一个Creator&#xff01; AST&#xff0c;抽象语法树&#xff0c;是一种包含丰富语义信息的格式&#xff0c;其中包括类型、表达式树和符号等。 TranslationUnitDecl&#xff1a;该类表示一个输入源文件 ASTContext&…

Qt注册类对象单例与单类型区别

1.实现类型SingletonTypeExample #ifndef SINGLETONTYPEEXAMPLE_H #define SINGLETONTYPEEXAMPLE_H#include <QObject>class SingletonTypeExample : public QObject {Q_OBJECT public://只能显示构造类对象explicit SingletonTypeExample(QObject *parent nullptr);//…

【学习笔记】深度学习实战 | LeNet

简要声明 学习相关网址 [双语字幕]吴恩达深度学习deeplearning.aiPapers With CodeDatasets 深度学习网络基于PyTorch学习架构&#xff0c;代码测试可跑。本学习笔记单纯是为了能对学到的内容有更深入的理解&#xff0c;如果有错误的地方&#xff0c;恳请包容和指正。 参考文献…