網絡地址和主機地址之間進行轉換的類

#pragma once
#include "Common.hpp"
// 網絡地址和主機地址之間進行轉換的類class InetAddr
{
public:InetAddr(){}InetAddr(struct sockaddr_in &addr) : _addr(addr){// 網絡轉主機_port = ntohs(_addr.sin_port); // 從網絡中拿到的!網絡序列// _ip = inet_ntoa(_addr.sin_addr); // 4字節網絡風格的IP -> 點分十進制的字符串風格的IPchar ipbuffer[64];inet_ntop(AF_INET, &_addr.sin_addr, ipbuffer, sizeof(_addr));_ip = ipbuffer;}InetAddr(const std::string &ip, uint16_t port) : _ip(ip), _port(port){// 主機轉網絡memset(&_addr, 0, sizeof(_addr));_addr.sin_family = AF_INET;inet_pton(AF_INET, _ip.c_str(), &_addr.sin_addr);_addr.sin_port = htons(_port);// local.sin_addr.s_addr = inet_addr(_ip.c_str()); // TODO}InetAddr(uint16_t port) :_port(port),_ip(){// 主機轉網絡memset(&_addr, 0, sizeof(_addr));_addr.sin_family = AF_INET;_addr.sin_addr.s_addr = INADDR_ANY;_addr.sin_port = htons(_port);}uint16_t Port() { return _port; }std::string Ip() { return _ip; }const struct sockaddr_in &NetAddr() { return _addr; }const struct sockaddr *NetAddrPtr(){return CONV(_addr);}socklen_t NetAddrLen(){return sizeof(_addr);}bool operator==(const InetAddr &addr){return addr._ip == _ip && addr._port == _port;}std::string StringAddr(){return _ip + ":" + std::to_string(_port);}~InetAddr(){}private:struct sockaddr_in _addr;std::string _ip;uint16_t _port;
};

? ? ? ? ?輕量級的網絡地址封裝類 InetAddr,它封裝了 sockaddr_in,提供了更友好的 C++ 接口,方便在主機格式(ip:port 字符串)和網絡格式(sockaddr_in)之間轉換。


??核心功能總結

功能說明
構造器支持從?sockaddr_inip+port僅port?三種方式構造
地址轉換自動完成?主機字節序 ? 網絡字節序字符串IP ? 二進制IP
接口封裝提供?Ip()Port()NetAddr()?等易用接口
比較與打印支持?==?比較、StringAddr()?打印

??逐段講解

1. 默認構造器
InetAddr() {}
  • 空構造器,用于后續手動設置地址。


2. 從?sockaddr_in?構造
InetAddr(struct sockaddr_in &addr) : _addr(addr)
{_port = ntohs(_addr.sin_port);char ipbuffer[64];inet_ntop(AF_INET, &_addr.sin_addr, ipbuffer, sizeof(ipbuffer));_ip = ipbuffer;
}
  • 作用:從網絡地址結構體中提取 ipport(主機字節序)。

  • 注意inet_ntopinet_ntoa 更現代、線程安全。


3. 從?ip + port?構造
InetAddr(const std::string &ip, uint16_t port) : _ip(ip), _port(port)
{memset(&_addr, 0, sizeof(_addr));_addr.sin_family = AF_INET;inet_pton(AF_INET, _ip.c_str(), &_addr.sin_addr);_addr.sin_port = htons(_port);
}
  • 作用:把用戶給的 ip:port 轉成網絡格式 sockaddr_in


4. 僅指定端口(監聽用)
InetAddr(uint16_t port) : _port(port), _ip()
{memset(&_addr, 0, sizeof(_addr));_addr.sin_family = AF_INET;_addr.sin_addr.s_addr = INADDR_ANY;_addr.sin_port = htons(_port);
}
  • 作用:用于服務器監聽,綁定任意 IP(0.0.0.0)。


5. 常用接口
uint16_t Port() { return _port; }
std::string Ip() { return _ip; }
const struct sockaddr_in &NetAddr() { return _addr; }
const struct sockaddr *NetAddrPtr() { return CONV(_addr); }
socklen_t NetAddrLen() { return sizeof(_addr); }
  • 提供訪問內部字段的快捷方式。


6. 比較與打印
bool operator==(const InetAddr &addr)
{return addr._ip == _ip && addr._port == _port;
}
std::string StringAddr()
{return _ip + ":" + std::to_string(_port);
}
  • 方便調試或日志輸出,如

    InetAddr addr("127.0.0.1", 8080);
    std::cout << addr.StringAddr(); // 輸出:127.0.0.1:8080

??一句話總結

InetAddr 是對傳統 sockaddr_in 的 C++ 封裝,屏蔽了底層字節序和字符串轉換細節,極大簡化了網絡地址的構造、訪問與打印。

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

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

相關文章

《Python 項目 CI/CD 實戰指南:從零構建自動化部署流水線》

??《Python 項目 CI/CD 實戰指南:從零構建自動化部署流水線》 一、引言:為什么 Python 項目需要 CI/CD? 在現代軟件開發中,CI/CD(持續集成 / 持續部署)已成為不可或缺的工程實踐。它不僅提升了開發效率,還顯著降低了部署風險。對于 Python 項目而言,CI/CD 的價值尤…

AJAX 技術

AJAX全稱是 Asynchronous JavaScript and XML ( 異步的JavaScript 和 XML )&#xff0c;使用該技術后&#xff0c;可以實現不刷新整個網頁&#xff0c;與服務器進行異步通信并更新部分網頁。一&#xff09;為什么需要AJAX?傳統網頁在與服務器通信時&#xff0c;需要刷新整個頁…

Python爬蟲實戰:研究NLTK庫相關技術

1. 引言 1.1 研究背景與意義 隨著互聯網的快速發展,網絡新聞已成為人們獲取信息的主要來源之一。每天產生的海量新聞文本蘊含著豐富的信息和知識,但也給信息獲取和分析帶來了挑戰。如何從大量非結構化的新聞文本中自動提取有價值的信息,識別熱點話題和趨勢,成為當前自然語…

ARM 學習筆記(二)

參考文獻&#xff1a;《ARM ArchitectureReference Manual ARMv7-A and ARMv7-R edition》1、MMU 1.1 背景早期的內存是比較小的&#xff0c;一般是幾十k&#xff0c;不過相應的程序也是比較小的&#xff0c;這時程序可以直接加載到內存中運行。后來為了支持多個程序的并行&…

Github 貪吃蛇 主頁設置

自動化腳本頂部元信息觸發條件&#xff08;on:&#xff09;作業&#xff08;jobs:&#xff09;步驟&#xff08;steps:&#xff09;1. 生成 SVG2. 推送到 output 分支Commit & Push在 README 里引用參考&#xff1a;https://github.com/Platane/Platane/tree/master 首先寫…

關于Spring RestTemplate

? 一、概述RestTemplate 是 Spring Framework 提供的一個同步 HTTP 客戶端工具&#xff0c;用于簡化與 RESTful API 的交互。它封裝了底層 HTTP 通信細節&#xff0c;提供了統一的 API 來發送各種 HTTP 請求&#xff08;GET、POST、PUT、DELETE 等&#xff09;&#xff0c;并自…

異步解決一切問題 |消息隊列 |減少嵌套 |hadoop |rabbitmq |postsql

設計準則“為什么要考慮這個問題”The forward logic is only about 10% of your code, everything else is 90%.主流邏輯 10%保障擴容和穩健的代碼設計90%同步代碼就是綁在一個繩上的螞蚱異步就是實現了解耦這個異步或許有點類似于--一些分布式數據的處理 設計如何實現的呢?…

Spring AI 項目實戰(十八):Spring Boot + AI + Vue3 + OSS + DashScope 實現高效語音識別系統(附完整源碼)

系列文章 序號 文章名稱 1 Spring AI 項目實戰(一):Spring AI 核心模塊入門 2 Spring AI 項目實戰(二):Spring Boot + AI + DeepSeek 深度實戰(附完整源碼) 3 Spring AI 項目實戰(三):Spring Boot + AI + DeepSeek 打造智能客服系統(附完整源碼) 4

指針數組和數組指針的應用案例

1. 指針數組應用&#xff1a;查找最長字符串用指針數組存儲若干字符串&#xff0c;編寫函數找出其中最長的字符串&#xff08;若有多個&#xff0c;返回第一個&#xff09;。#include <stdio.h> #include <string.h>// 函數原型&#xff1a;找出最長字符串 const c…

MCU進入低功耗模式前的引腳處理原則和方法 --> 以最小化低功耗電流

在MCU進入低功耗模式(如Sleep, Stop, Standby, Deep Sleep等)前,精心處理每一個GPIO引腳的狀態是最大限度降低功耗電流的關鍵一步。懸空或配置不當的引腳是導致“漏電”的常見原因。以下是處理引腳以達到最小低功耗電流的原則和方法: ?? 核心原則 避免浮空輸入: 浮空(…

張 關于大語言模型(LLM)置信度研究的經典與前沿論文 :溫度縮放;語義熵;自一致性;事實與反思;檢索增強;黑盒引導;

關于大語言模型(LLM)置信度研究的經典與前沿論文 :溫度縮放;語義熵;自一致性;事實與反思;檢索增強;黑盒引導; 目錄 關于大語言模型(LLM)置信度研究的經典與前沿論文 :溫度縮放;語義熵;自一致性;事實與反思;檢索增強;黑盒引導; 一、校準方法:讓模型概率更貼近真實正確…

ICT測試原理之--什么是假短

ICT測試原理之–什么是假短 文章目錄ICT測試原理之--什么是假短一、假短的由來防止假短二、無法檢測的短路示例解決無法檢測的短路調試短路文件調試意外斷路調試意外短路三、調試假短報告短路和斷路報告假短報告短路設備/引腳功能性短路測試功能性短路測試的語法一、假短的由來…

三種深度學習模型(LSTM、CNN-LSTM、貝葉斯優化的CNN-LSTM/BO-CNN-LSTM)對北半球光伏數據進行時間序列預測

代碼功能 該代碼實現了一個光伏發電量預測系統&#xff0c;采用三種深度學習模型&#xff08;LSTM、CNN-LSTM、貝葉斯優化的CNN-LSTM&#xff09;對北半球光伏數據進行時間序列預測&#xff0c;并通過多維度評估指標和可視化對比模型性能。 算法步驟 1. 數據預處理 數據導入&am…

Typecho+阿里云CDN完整配置:防止DDoS攻擊與IP暴露

文章目錄 Typecho使用阿里云CDN保護網站真實IP地址的完整指南 背景與問題分析 技術選型與方案設計 詳細實施步驟 第一步:阿里云CDN基礎配置 第二步:DNS解析設置 第三步:源站服務器防護配置 Nginx服務器配置 防火墻配置(以Ubuntu為例) 第四步:Typecho配置調整 高級防護措施…

[硬件]運算放大器對相位噪聲的影響與設計提示

運算放大器對相位噪聲的影響與設計提示 文章目錄運算放大器對相位噪聲的影響與設計提示運放影響位噪聲的主要因素如何最小化運放對相位噪聲的影響總結運算放大器是常用的模擬電路元器件&#xff0c;通常用于放大信號&#xff0c;增強驅動。但是當使用運放放大一個信號時&#x…

github jekyll+chirpy主題搭建博客

github jekyllchirpy主題搭建博客 標簽&#xff1a;后端、blog、jekyll 全文鏈接 本文簡要介紹了如何基于 GitHub Pages、Jekyll 及 Chirpy 主題搭建個人博客的流程和注意事項。 主要內容 GitHub Pages 站點簡介 可免費搭建個人博客&#xff0c;支持自定義域名&#xff0c;適…

Flutter狀態管理篇之ValueNotifier(三)

目錄 前言 一、ValueNotifier 概述 二、ValueNotifier 的實現原理 1.類定義 1.類定義 2.關鍵字段 3.關鍵方法 1.構造函數 2.getter:value 3.setter:value: 4.toString 2.繼承自ChangeNotifier的機制 3.ValueListenable 接口 三、ValueNotifier 的用法 1.基本用法…

Ubuntu togo 系統安裝指南

制作一個 “Ubuntu To Go” 系統&#xff08;也就是一個可以隨身攜帶、在不同電腦上啟動并擁有持久化存儲的U盤系統&#xff09;是解決你問題的完美方案。 這樣一來&#xff0c;你就可以&#xff1a; 不改動你現有的電腦系統 (保留你的Ubuntu 20.04 或 Windows)。擁有一個完整…

Python爬蟲實戰:研究pefile庫相關技術

一、引言 可執行文件(Portable Executable,PE)是 Windows 操作系統中最常見的文件格式,包括.exe、.dll、.sys 等多種類型。對 PE 文件的分析在軟件逆向工程、惡意軟件檢測、系統安全研究等領域具有重要意義。傳統的 PE 文件分析主要依賴手動操作和專業工具,效率較低且對分…

盟接之橋說制造:差異化定位與效率競爭的雙輪驅動

在當今競爭日益激烈的商業環境中&#xff0c;企業如何在市場中脫穎而出&#xff0c;既避免陷入同質化的價格戰&#xff0c;又能夠通過效率提升實現可持續發展&#xff0c;是每一個經營者必須思考的問題。本文將圍繞“差異化”與“效率競爭”兩大核心戰略展開分析&#xff0c;探…