【C語言網絡編程】HTTP 客戶端請求(域名解析過程)

在做 C 語言網絡編程或模擬 HTTP 客戶端時,第一步就離不開“把域名解析為 IP 地址”這一步。很多人可能直接復制粘貼一段 gethostbyname 的代碼,但未必真正理解它的原理。

本篇博客將圍繞一個經典函數:

char *host_to_ip(const char *hostname)

深入剖析 DNS 解析過程IP 地址轉換機制,并進一步帶你了解 HTTP 請求是如何基于 TCP 通信進行的。

一、核心函數:host_to_ip 是干什么的?

char *host_to_ip(const char *hostname) {struct hostent *host_entry = gethostbyname(hostname);  // 1. DNS 查詢if (host_entry) {return inet_ntoa(*(struct in_addr*)host_entry->h_addr_list[0]); // 2. IP 轉換}return NULL;
}

這段代碼的目標是:將一個域名(如 www.baidu.com)轉換為對應的 IP 地址字符串(如 "14.215.177.39")

二、代碼詳解:每一步到底在干什么?

第一步:DNS 解析

struct hostent *host_entry = gethostbyname(hostname);

這個函數調用了底層的 DNS 解析邏輯,流程如下:

  • 檢查系統的 DNS 緩存或 /etc/hosts

  • 若無記錄,則構造 DNS 請求報文,通過 UDP 協議發送到 DNS 服務器(如 114.114.114.114)

  • 等待服務器響應,返回域名對應的 IP 地址

  • 封裝在 struct hostent 結構體中

第二步:IP 轉換為字符串

inet_ntoa(*(struct in_addr*)host_entry->h_addr_list[0]);

host_entry->h_addr_list[0] 是原始的 4 字節 IP 地址(網絡字節序),不能直接打印。

所以我們使用 inet_ntoa() 把它轉換成字符串形式:

  • 輸入:一個 struct in_addr 類型的二進制 IP 地址

  • 輸出:可讀字符串,如 "14.215.177.39"

三、這段代碼在 HTTP 請求中的位置

[輸入 URL] -> [解析域名 -> IP] -> [建立 TCP 連接] -> [發送 HTTP 請求] -> [接收響應]↑就在這一步!

也就是說,host_to_ip() 實際完成的是整個 HTTP 通信的第一步:獲取目標服務器的 IP 地址。

如果這一步失敗(如 DNS 解析失敗、沒有網絡),后續的 socket 連接和 HTTP 請求就完全無法進行。

四、HTTP 是如何發送請求的?(基于 TCP)

HTTP 是一個應用層協議,它不能直接和服務器通信,而是借助 TCP 作為底層傳輸通道。流程如下:

1. 客戶端通過 DNS 得到目標 IP(host_to_ip 實現)
2. 使用 socket 與服務器 IP 的 80(HTTP)或 443(HTTPS)端口建立 TCP 三次握手連接
3. 連接成功后,發送 HTTP 請求報文
4. 服務器返回 HTTP 響應報文
5. 客戶端接收、解析、展示結果

五、完整代碼

/*** 將主機名(域名)轉換為對應的 IP 地址字符串* 例如:輸入 "www.baidu.com",返回 "14.215.177.39"*/
char *host_to_ip(const char *hostname) {// 通過 DNS 解析主機名,返回主機信息結構體指針struct hostent *host_entry = gethostbyname(hostname);   // gethostbyname 是阻塞式調用// 檢查解析是否成功if (host_entry) {/*** host_entry->h_addr_list 是一個指針數組,存儲所有解析到的 IP 地址(可能多個)* 每個元素是一個 struct in_addr* 類型(指向網絡字節序的 IP)* 這里取第一個 IP(通常是優先級最高的)** 需要將該地址強制轉換為 struct in_addr*,傳給 inet_ntoa 進行轉換** 注意:inet_ntoa 返回的是靜態內存,不能多線程共享或多次直接使用返回值*/return inet_ntoa(*(struct in_addr*)host_entry->h_addr_list[0]);}// 解析失敗,返回 NULLreturn NULL;
}

https://github.com/0voice

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/88808.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88808.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/88808.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Node.js特訓專欄-實戰進階:16. RBAC權限模型設計

?? 歡迎來到 Node.js 實戰專欄!在這里,每一行代碼都是解鎖高性能應用的鑰匙,讓我們一起開啟 Node.js 的奇妙開發之旅! Node.js 特訓專欄主頁 專欄內容規劃詳情 我將從RBAC權限模型的基礎概念、核心組件講起,詳細闡述其設計原則、數據庫模型設計,還會結合代碼示例展示在…

mac上BRPC的CMakeLists.txt優化:解決Protobuf路徑問題

問題背景與挑戰 在構建高性能RPC框架BRPC時,?Protobuf依賴路徑的配置往往是開發者面臨的主要挑戰之一。原始CMake配置在尋找Protobuf庫時存在以下痛點: ?路徑搜索不精確?:默認find_library無法定位自定義安裝路徑下的Protobuf?版本兼容…

Go 性能分析利器:pprof 工具實戰指南

在 Go 語言開發中,性能問題往往是項目上線后最棘手的挑戰之一。無論是 CPU 占用過高、內存泄漏,還是 goroutine 失控,都可能導致服務響應緩慢甚至崩潰。而pprof作為 Go 官方提供的性能分析工具,就像一把精準的手術刀,能…

fio測試SSD直接I/O(Direct IO)性能僅有100MB/s的問題解決

針對您使用fio測試SSD直接I/O(Direct IO)性能僅有100MB/s的問題,結合SSD特性和fio測試原理 fio測試SSD直接I/O(Direct IO)性能僅有100MB/s的問題 - LinuxGuideLinuxGuide 以下是可能的原因及優化方案: &a…

EVO-0:具有隱空間理解的視覺-語言-動作模型

25年6月來自上海交大、EvoMind Tech 和上海算法創新研究院(IAAR-Shanghai)的論文“EVO-0: Vision-Language-Action Model with Implicit Spatial Understanding”。 視覺-語言-動作 (VLA) 模型已成為一種有前途的框架,可使通用機器人能夠在現…

文心大模型4.5開源測評:輕量化部署實踐與多維度能力驗證

前言:開源浪潮下的輕量化革命 2025年百度文心大模型4.5系列的開源,標志著國產大模型從“參數競賽”轉向“實用落地”的關鍵轉折。當行業仍在追逐千億參數模型時,文心4.5以0.3B輕量級模型撕開一條新賽道——單卡部署、低成本運維、中文場景高…

LeetCode 2401.最長優雅子數組

給你一個由 正 整數組成的數組 nums 。 如果 nums 的子數組中位于 不同 位置的每對元素按位 與(AND)運算的結果等于 0 ,則稱該子數組為 優雅 子數組。 返回 最長 的優雅子數組的長度。 子數組 是數組中的一個 連續 部分。 注意:長…

中華心法問答系統的解讀(1)

中華心法問答系統一、研究背景1. 研究意義2. 研究目的3. 信息檢索技術二、主要研究內容三、相關技術介紹1. Flask框架技術2. BERT模型(1)基本概念(2)BERT解決的問題(3)BERT的核心結構a. 模型結構b. 預訓練任…

Java 大視界 -- Java 大數據在智能安防視頻監控系統中的視頻摘要快速生成與檢索優化(345)

Java 大視界 -- Java 大數據在智能安防視頻監控系統中的視頻摘要快速生成與檢索優化(345)引言:正文:一、Java 構建的全場景視頻處理系統(含校園 / 工廠 / 礦區適配)1.1 校園宿舍區夜間檢索方案(…

信號量機制,互斥的避免自旋鎖的實現方法(操作系統)

這次的比喻場景要升級了,因為它既能解決互斥問題,也能解決同步問題。我們用一個更綜合的場景:一個擁有多輛共享單車的站點。共享單車 (資源):站點里有多輛共享單車,數量是有限的。你 (進程):想借一輛車去辦…

零基礎 “入坑” Java--- 十、繼承

文章目錄一、何為繼承二、繼承語法三、父類成員訪問1.成員變量2.成員方法四、super關鍵字五、子類構造方法六、super和this辨析七、再談初始化八、protected關鍵字九、繼承方式十、final關鍵字十一、繼承與組合根據我們學過的類的知識,我們來定義兩個類:…

JS進階-day1 作用域解構箭頭函數

作用域全局作用域——>盡量少使用,避免變量污染局部作用域——>函數作用域、塊級作用域作用域鏈——>底層變量查找機制(先在當前函數作用域查找,如果找不到,就沿著作用域鏈向上級作用域查找,直到全局作用域&a…

Arduino 無線通信實戰:使用 RadioHead實現 315MHz 433M模塊數據傳輸

本文將介紹如何使用 Arduino 和 RadioHead 庫實現 315MHz(或 433MHz)ASK 無線通信。通過兩個 Arduino 控制板,一個作為發射端,一個作為接收端,實現“按鍵控制 → 無線發送 → LED 控制”的基礎通信功能,非常…

012_PDF處理與文檔分析

PDF處理與文檔分析 目錄 PDF支持概述支持的功能文檔限制上傳方式分析能力應用場景最佳實踐 PDF支持概述 核心能力 Claude現在可以直接處理PDF文檔,提供全面的文檔分析能力。這項功能支持: 文本內容分析:提取和理解PDF中的文本圖像識別&…

系規備考論文:論IT服務知識管理

論IT服務知識管理 摘要 2022年7月,我公司中標某市化工廠網絡視頻監控管理系統綜合平臺運維服務項目,并任命我為系統規劃與管理師。該項目組織結構為項目型,合同金額為115.5萬元(含稅),工期為1年。本運維服務項目的主要工作包括系統軟件和網絡設備的日常監控與維護,定期…

2025.7.12總結

最近又兩三天沒寫總結了,如今必須要寫一稿,畢竟事關賺錢認知的一次顛覆。在我原有的認知里,賺錢,就是通過出賣自己的勞動時間,精力,給他人提供價值輸出。但是,賺錢,只能通過出賣體力…

把 DNA 當 PCIe:一條 365 nt 鏈實現 64 Gbps 片上光互連——基于鏈式 F?rster 共振的分子級波分復用鏈路

作者 | Blossom.118 2025-07-13 關鍵詞:DNA 光子學、FRET 波分復用、分子 PCIe、零能耗光鏈路、CMOS 兼容、開源版圖 ---- 1. 為什么用 DNA 做光互連? ? 帶寬密度:硅光 1 m 波導最高 0.4 Tbps/mm;一條 2 nm 直徑的 DNA 雙鏈&am…

[論文閱讀]Text Compression for Efficient Language Generation

Text Compression for Efficient Language Generation [2503.11426] Text Compression for Efficient Language Generation NAACL 2025 提出了“Generative Pretrained Thoughtformer”(GPTHF),這是一個分層 transformer 語言模型&#xf…

SwiftUI 7 新 WebView:金蛇出洞,網頁江湖換新天

概述 崇禎年間,華山派武學雖盛,卻在應對江湖新局時漸顯頹勢;如今 SwiftUI 江湖亦是如此 ——WWDC 25 之前,若要在 SwiftUI 中顯示網頁,開發者恰似袁承志初闖江湖,縱有一身本領,卻苦無稱手兵刃。…

LeetCode|Day9|976. 三角形的最大周長|Python刷題筆記

LeetCode|Day9|976. 三角形的最大周長|Python刷題筆記 🗓? 本文屬于【LeetCode 簡單題百日計劃】系列 👉 點擊查看系列總目錄 >> 📌 題目簡介 題號:976. 三角形的最大周長 難度&#x…