【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.pswp.cn/news/711461.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/711461.shtml
英文地址,請注明出處:http://en.pswp.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、…

NLog條件配置——實現將包含某個特定字符串日志寫入指定文件

需求產生緣由 在開發中為了了解程序在運行的內存狀態并記錄下來&#xff0c;以便出問題時判斷是不是與內存相關。于是實時采集了開發程序需要的內存信息。但采集的內存信息在存儲時&#xff0c;以NLog中的Trace級別來存儲的話&#xff0c;會與程序其它Trace級別的日志都記錄在…

瑞吉蒼穹外賣如何拓展?已經經過不同公司多輪面試。項目中會問到哪些問題?以及問題如何解決?

別催了&#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…

C語言系列16——C語言標準庫深度揭秘:探索其內核與應用

目錄 寫在開頭1.C語言標準庫概覽1.1 定義與組成1.2 歷史發展簡述1.3 C標準庫與C標準庫的關系 2.標準庫的核心組件2.1 輸入輸出庫&#xff08;stdio.h&#xff09;2.1.1 定義與作用2.1.2 核心函數和用法2.1.3 常見問題與解決方案 2.2 字符串和字符處理&#xff08;string.h &…

面試經典150題【41-50】

文章目錄 面試經典150題【41-50】49.字母異位詞分組1. 兩數之和202.快樂數219. 存在重復元素II128.最長連續序列228. 匯總區間56.合并區間&#xff08;華為面試題&#xff09;57.插入區間452.用最少的箭引爆氣球20.有效的括號 面試經典150題【41-50】 49.字母異位詞分組 用這種…

今日話題:---自卑

自卑是一種普遍存在的心理現象&#xff0c;它可能源于個人對自身能力、外貌、社會地位等方面的不滿意或不自信。自卑感可能會導致消極的情緒和行為&#xff0c;如焦慮、抑郁、逃避現實等。然而&#xff0c;適度的自卑感也可能激發個人努力提升自己&#xff0c;從而實現自我成長…

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 來自 …

【實戰-08】 flink自定義Map中的變量的行為

場景 自定義Map或者別的算子的時候&#xff0c;有時候需要定義一些類變量&#xff0c;在flink內部高并發的情況下需要正確理解這些變量的行為 代碼 package com.pg.function;import org.apache.flink.api.common.functions.MapFunction; import org.apache.flink.api.common…

哇去,有了這篇文章,項目中引入了再多的字體包,我都不怕了!!!

通常情況下&#xff0c;我們在開發一個新項目的時候&#xff0c;項目那邊通常都會提供一些項目所需的字體包&#xff0c;來滿足項目對字體展示的特殊需求。 這部分大家都比較熟悉&#xff0c;就不詳細講了&#xff0c;直接上代碼&#xff1a; /* 引入字體包 */ font-face {fo…

異常處理(黑馬學習筆記)

當前問題 登錄功能和登錄校驗功能我們都實現了&#xff0c;下面我們學習下今天最后一塊技術點&#xff1a;異常處理。首先我們先來看一下系統出現異常之后會發生什么現象&#xff0c;再來介紹異常處理的方案。 我們打開瀏覽器&#xff0c;訪問系統中的新增部門操作&#xff0…

GEE高階應用python wxee——MODIS氣象數據可視化處理(2022年3-9月葡萄牙為例)以及可視化地圖加載

MODIS wxee 是專為處理氣象數據而設計的,但它在遙感數據方面也很有用。在本示例中,我們將了解 wxee 如何處理 MODIS 傳感器的數據,以及如何利用 xarray 對象創建彩色復合圖。 安裝和設定 #!pip install wxeeimport ee import wxeeee.Authenticate() wxee.Initialize(proje…

前端筆記01---html 的加載

文章目錄 HTML<meta><script>MIME CSSHTML 與 DOM 有什么不同MDNMozilla 臟檢查依賴注入虛擬 DOM虛擬DOM性能開銷 性能性能開銷包括哪些方面性能瓶頸性能&#xff1f; 事件事件委托事件冒泡passive: true 合成器線程 HTML html head <meta> <meta> 元素…

貪心算法介紹

貪心算法是一種在求解問題時總是做出在當前看來是最好的選擇的算法。它不從整體最優上加以考慮&#xff0c;所做出的選擇只是在某種意義上的局部最優解。貪心算法不是對所有問題都能得到整體最優解&#xff0c;關鍵是貪心策略的選擇&#xff0c;選擇的貪心策略必須具備無后效性…

K8S相關小技巧《五》

需求&#xff1a; 作為Kubernetes管理員&#xff0c;前一段時間有收到一個需求&#xff0c;需要創建一個可用的storage class&#xff0c;用于提供給給隔離的用戶使用共享磁盤。共享磁盤為NFS磁盤&#xff0c;本例以NFS為例&#xff0c;其他類型的storage class創建也是類似&a…

模型優化_如何提高網絡/模型的泛化能力?(全面)

目錄 1. 以數據為中心的泛化方法 1.1 使用更多數據 1.2 做好數據預處理 特征工程 1.3 數據增強 1.4 調整數據分布 2. 以模型為中心的泛化方法 2.1 使用更大批次 超參數調優 2.2 調整目標函數 2.3 調整網絡結構 2.4 屏蔽網絡節點 2.5 權值正則化 2.6 偏差-方差權衡…