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

news/2024/4/15 17:04:44

😁博客主页😁:🚀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.mrgr.cn/p/85426320

相关文章

三色标记法

三色标记法是一种垃圾回收法,它可以让JVM不发生或仅短时间发生STW(Stop The World),从而达到清除JVM内存垃圾的目的。JVM中的「CMS、G1垃圾回收器」所使用垃圾回收算法即为三色标记法。 三色标记算法思想 三色标记法将对象的颜色分为了黑、灰、白,三种颜色。 「白色」:该对…

vscode输入英文时字体之间的间隔突然变大,似中文

vscode输入英文时字体之间的间隔突然变大&#xff0c;似中文 主要原因&#xff1a; 是由于输入法变成全角模式了。原因可能是不小心按了 shift空格键快捷键造成的。 正常情况&#xff0c;全角就是字母和数字等与汉字占等宽位置的字。 半角就是ASCII方式的字符&#xff0c;在没…

java输出helloworld

1.安装java环境 2.建个文件夹和文件 写java程序 3.写代码 helloworldpublic class HelloWorld{public static void main(String[] args){System.out.println("Helloworld");} }cmd运行这个文件夹 输入指令 java HelloWorld.java 会生成如下带class的文件 4.再输入指…

SQLSERVER 2014 删除数据库定时备份任务提示失败DELETE 语句与 REFERENCE 约束“FK_subplan_job_id“冲突

SQLSERVER 2014 删除数据库定时备份任务提示失败DELETE 语句与 REFERENCE 约束“FK_subplan_job_id“冲突 &#xff0c;错误如图&#xff1a; 问题原因&#xff1a;不能直接删除作业 任务&#xff0c;需要先删除计划里面的日志、删除代理作业、删除子计划以后才能删除作业。 解…

Django学习笔记-ModelForm使用(完全依赖)

1.创建模型 ,code,name,sex,entrydate 2.模型映射 python manage.py makemigrations myapp01,python manage.py migrate 3.创建模型表单,继承forms.ModelForm,Meta:元数据,models需引入,fields填写引用的模型变量 4.创建testModelForm.html,添加urls 5.views编写testmodelfo…

Pycharm:在工程目录下新建一个Python.exe

1、起因 公司电脑上把Python安装在了系统盘,但是我没有系统盘的修改权限,导致用pip时无法把包安装到系统盘 2、解决方案 在工程目录下,为工程新建一个Python.exe,之后该工程都采用这个python和它的pip,把包安装在工程包下。 1)File→Settings→Project:xxx→Python Inter…

数据库专家带你体验PolarDB MySQL版 Serverless的极致弹性特性​!

体验地址:https://developer.aliyun.com/topic/march/polardbserverless本次基于阿里云瑶池数据库解决方案体验馆,带你体验PolarDB MySQL Serverless形态下的性能压测环境,基于可选择的标准压测工具进行压测,构造弹性场景进行压测,实时动态展示弹性能力、价格和性价比结果…

【HbuilderX】 uniapp实现 android申请权限 和 退出app返回桌面

目录 android申请权限&#xff1a; 监听用户是否开启权限或关闭权限&#xff1a; 退出app返回桌面&#xff1a; android申请权限&#xff1a; 首先在 manifest.json 内添加你所需要用到权限 添加权限插件 permission.js 一次就好1/权限插件 - Gitee.comhttps://gitee.co…

C++ 游戏飞机大战, 字符型的

//#define _CRT_SECURE_NO_WARNINGS 1 用于禁止不安全函数的警告 #include<iostream> #include<stdlib.h> #include<string> #include<conio.h> #include<Windows.h> #include<time.h> #include <graphics.h> using namespace std;…

MySQL:函数

提醒&#xff1a; 设定下面的语句是在数据库名为 db_book里执行的。 创建user_info表 注意&#xff1a;pwd为密码字段&#xff0c;这里使用了VARCHAR(128)类型&#xff0c;为了后面方便对比&#xff0c;开发项目里一般使用char(32)&#xff0c;SQL语句里只有MD5加密函数 USE db…

蓝桥杯第十四届电子类单片机组决赛程序设计

目录 前言 单片机资源数据包_2023&#xff08;点击下载&#xff09; 一、第十四届比赛题目 1.比赛题目 2.题目解读 1&#xff09;任务要求 2&#xff09;注意事项 二、显示功能实现 1.关于高位为0时数码管熄灭功能的实现 2.关于显示小数位的处理 3.关于“校准值”的…

支持Flash插件的浏览器

想必,在如今都不支持flash插件的浏览器的环境下,迫于老项目使用了flash插件,但是又不能更改使用的富文本框架,只能另找支持flash插件的浏览器。 如今,你不用找了。 在adobe的flash帮助手册里有各种帮助指南,可以参阅下。 或在其flash.cn网站下载flash游戏浏览器。其他 ch…

springboot230基于Spring Boot在线远程考试系统的设计与实现

在线远程考试系统设计与实现 摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到…

基于springboot + vue实现的前后端分离-在线旅游网站系统(项目 + 论文)

项目介绍 本旅游网站系统采用的数据库是MYSQL &#xff0c;使用 JSP 技术开发&#xff0c;在设计过程中&#xff0c;充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。 技术选型 后端: SpringBoot Mybatis 数据库 : MyS…

AIOT竞赛评分

1乐聚机器人: 清华和北航 白名单蓝桥杯 1 1 1 1 1 1 1 1 11 1 1小学,低年龄和高年龄。1 11https://www.lejurobot.com/cn/ 1 1AELOS KUAVO ROBAN CUBE 关于乐聚 社区与服务商城 EN 中文关于乐聚 关于我们招募精英新闻中心 企业新闻媒体报道社区 精彩视频…

单片机开发中pc和sp的作用

概念 两个都是寄存器 pc(program counter)程序计数器 SP (stack pointer)堆栈指针 原理 pc 存放下一条指令的寄存器,cpu从内存中拿指令 ,寄存器是属于cpu的一部分,不属于内存 sp 堆栈指针,本质是寄存器,指向堆栈的顶部, 爬论坛:https://www.cnblogs.com/uestcliming…

VMware vSphere 8.0 Update 2b 下载 - Broadcom VMware 首次重大更新

VMware vSphere 8.0 Update 2b 下载 - Broadcom VMware 首次重大更新VMware vSphere 8.0 Update 2b 下载 - Broadcom VMware 首次重大更新 VMware vSphere 8.0 Update 2b 下载 - 企业级工作负载平台 2 月 29 日(北京时间 3 月 1 日),VMware by Broadcom 停更 5 个月后,终于…

出站_完工下线

出站_完工下线fs 1.打开子应用后光标定位到设备码文本框,扫设备码,获取资源对象resrce对象所有属性,查询条件为RESRCE属性=扫码值 名称类型可为空默认/表达式GeneratedOn Null不可见存储注释IDNUMBERN AlwaysNN 流水码RESRCENVARCHAR2(255)N NN 资源编码SITENVARCHAR2(255)Y …

手机AI摄影时代开启,传音引领行业标准化建设

今年春节&#xff0c;AI摄影可谓大出风头。人们在社交平台晒出自己在龙年的AI写真&#xff0c;极大地增添了节日的氛围感&#xff0c;也让我们看到了“AI摄影”的价值。新年伊始&#xff0c;手机巨头们纷纷布局该赛道&#xff0c;基于AI大模型实现的影像功能成为业界关注焦点。…

Unity 脚本-生命周期常用函数

在Unity中&#xff0c;万物皆是由组件构成的。 右键创建C&#xff03;脚本&#xff0c;拖动脚本到某物体的组件列表。 生命周期相关函数 using System.Collections; using System.Collections.Generic; using UnityEngine;// 必须要继承 MonoBehaviour 才是一个组件 // 类名…