[muduo网络库]——muduo库InetAddress类(剖析muduo网络库核心部分、设计思想)

接着之前我们[muduo网络库]——muduo库EventLoopThreadPool类(剖析muduo网络库核心部分、设计思想),我们接着看完除去TcpServer的最后一个InetAddress类。InetAddress 类是 muduo 网络库中的一个重要类,用于表示网络中的 IP 地址和端口号。

InetAddress类

用于表示网络中的通信实体的地址信息,例如服务器地址、客户端地址等。通过 InetAddress 类,我们可以方便地操作 IP 地址和端口号,实现网络通信的功能。它接受一个端口号和一个 IP 地址字符串,默认情况下端口号为0,IP地址为 “127.0.0.1”。

explicit InetAddress(uint16_t port = 0, std::string ip="127.0.0.1");

重要成员变量

 sockaddr_in addr_;

这里我们只支持ipv4,所以定义了一个sockaddr_in类型的结构体来处理网络通信的地址,结构体形式如下:

struct sockaddr_in {short            sin_family;    // 2 字节 ,地址族,e.g. Ipv4(AF_INET)ipv6(AF_INET6)unsigned short   sin_port;      // 2 字节 ,16位TCP/UDP 端口号 e.g. htons(3490),struct in_addr   sin_addr;      // 4 字节 ,32位IP地址char             sin_zero[8];   // 8 字节 ,不使用
};
struct in_addr {unsigned long s_addr;          // 32位IPV4地址打印的时候可以调用inet_ntoa()函数将其转换为char *类型.
};

需要注意的是: sin_port和sin_addr都必须是网络字节序(NBO),一般可视化的数字都是主机字节序(HBO)。

重要成员函数

  • 构造函数
InetAddress::InetAddress(uint16_t port, std::string ip)
{bzero(&addr_, sizeof addr_);addr_.sin_family = AF_INET;addr_.sin_port = htons(port);//主机字节序到网络字节序addr_.sin_addr.s_addr = inet_addr(ip.c_str()); //将网络主机地址为网络字节序二进制值
}
  1. AF_INET,表示使用 IPv4 地址族
  2. htons()是将一个16位数从主机字节顺序转换成网络字节顺序,简单的说就是把一个16位数高低位呼唤。
  3. inet_addr将网络主机地址为网络字节序二进制值。
  • 返回sockaddr结构体指针
const sockaddr_in* getSockAddr() const {return &addr_;}
  • 设置当前 InetAddress 实例中的 sockaddr_in 结构。
void setSockAddr(const sockaddr_in &addr) { addr_ = addr; }
  • 获取ip地址的点十分进制的字符串
std::string InetAddress::toIp() const
{//addr_ 读取ip地址,转换成点分十进制char buf[64] ={0};::inet_ntop(AF_INET,&addr_.sin_addr,buf,sizeof buf);return buf;
}

调用了系统的inet_ntop()函数,将IPv4或IPv6 Internet网络地址转换为 Internet点分十进制(对于ipv4就是将32位地址每8位加一个空格,然后将二进制转换为十进制,中间加个.)的字符串,输出到buf里,并返回该字符串。
这里在简单提一句: inet_pton():将点分十进制表示形式的IPv4或IPv6 Internet网络地址转换为数字二进制形式。

  • 获取ip地址和port端口的点十分进制的字符串
std::string InetAddress::toIpPort() const
{//ip:port char buf[64] ={0};::inet_ntop(AF_INET,&addr_.sin_addr,buf,sizeof buf);size_t end=strlen(buf); //ip的有效长度uint16_t port = ntohs(addr_.sin_port);sprintf(buf+end,":%u", port);return buf;
}

先获取ip地址的点十分进制的字符串,然后调用系统的ntohs函数,将一个16位数由网络字节顺序转换为主机字节顺序,简单的说就是把一个16位数高低位互换。最后使用 sprintf() 函数将 IP 地址字符串和端口号格式化为 “ip:port” 的形式,并返回该字符串。
这里在简单提一下:
ntohl()是将一个32位数由网络字节顺序转换为主机字节顺序。
htonl()是将一个32位数从主机字节顺序转换成网络字节顺序。
htons()是将一个16位数从主机字节顺序转换成网络字节顺序,简单的说就是把一个16位数高低位呼唤。

  • 获取端口号(本机字节序)
uint16_t InetAddress::toPort() const
{return ntohs(addr_.sin_port);
}

补充一下网络字节顺序和主机字节顺序

网络字节序和主机字节序是计算机网络中常用的两种数据存储格式。
首先是大端和小端,其实这个都不陌生了,简单的说就是对应数据的高字节存放在低地址,低字节存放在高地址上就是大端顺序,对应数据的高字节存放在高地址,低字节存放在低地址上就是小端顺序

  • 主机字节序: 指的是在计算机内部存储数据时采用的字节排序方式。对于一个长为4个字节的整数,若采用大端字节序,则该整数在内存中的存储顺序是:以地址递增顺序依次存储其最高位到最低位的每个字节;若采用小端字节序,则该整数的字节则按照倒序的方式存储于内存中。一般地,在编译器里面设置的是小端顺序,这个可以根据自己的编译器看下设置。
  • 网络字节序: 指的是一种标准的字节序,规定了数据在网络数据传输中采用的字节序,即大端字节序,也被称为网络序(Network Byte Order)。理由是因为不同的机器可能采用不同的主机字节序,而网络通信必须使用统一的字节序,这样才能保证不同系统之间的通信正常进行。

代码地址:https://github.com/Cheeron955/mymuduo/tree/master

好了~ 有关于muduo库InetAddress类的细节就到此结束了,里面涉及到了一些地址类型的转换函数,还是比较重要的,大家要多看看别记混哦~
单个类的讲解就到此结束了,剩余的TcpServer单独讲起来会很困难,所以我们从EchoServer开始,对Muduo库的主线进行脉络梳理,会串起来之前讲的类,如果之前有什么不懂的地方,可以接着关注一下之后的内容,也许就帮到大家了,我们下一节见~

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

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

相关文章

maven deploy项目发布到中央仓库GPG签名失败signing failed: No secret key

maven deploy项目发布到中央仓库GPG签名失败signing failed: No secret key 执行操作 在我执行命令打包项目到中央仓库时失败 mvn clean deploy错误信息 [INFO] --- gpg:3.1.0:sign (sign-artifacts) LocalCache --- [INFO] Signing 4 files with 9961AA14xxxxxxxxxxxxxxD…

Ps 滤镜:彩色铅笔

Ps菜单:滤镜/滤镜库/艺术效果/彩色铅笔 Filter Gallery/Artistic/Colored Pencil 彩色铅笔 Colored Pencil滤镜用于模拟用彩色铅笔手绘的艺术效果,它能够在纯色背景上重新绘制图像,同时保留边缘细节并显示出粗糙的阴影线。此滤镜特别适合用于…

STM32HAL库-中断篇

中断 中断简介 中断是一种事件处理机制,可以暂停主程序的运行,转而处理特定事件程序。 中断的作用和意义: 实时控制 在确定事件内对响应事件做出相应 故障处理 检测到故障需要第一时间处理 数据传输 如串口通信,不确定数…

cgicc开发 (结合jsoncpp)

#include <iostream> #include <fstream> //读写文件 c标准库 #include <string> //字符串类 c标准库 #include <sstream> //字符串流 c标准库 #include <assert.h> #include "json/json.h" //jsoncpp的头文件#include <cgicc/CgiD…

Java基础(37)XSS攻击、SQL注入攻击、CSRF攻击

XSS攻击&#xff08;跨站脚本攻击&#xff09; 定义&#xff1a;XSS&#xff08;Cross-Site Scripting&#xff09;攻击是指攻击者在目标网站上注入恶意的客户端脚本&#xff0c;当其他用户浏览该网站时&#xff0c;嵌入在网页中的这段脚本会被执行&#xff0c;从而达到攻击的…

<sa8650>QCX Usecase 使用详解—拓扑图 XML 定义

<sa8650>QCX Usecase 使用详解—拓扑图 XML 定义 一 、前言二、拓扑图 XML 定义2.1 <Node, port, link>2.2 < XML prolog >2.3 < UsecaseDef >2.4 < Usecase>2.5 < Targets>2.5.1 < Target>2.5.2 < Range>2.6 < Pipeline>2.…

C++之lambda【匿名函数】

1、语法 语法结构&#xff1a; [捕获列表](参数列表) mutable(可选) 异常属性 -> 返回类型 {// 函数处理 }注意&#xff1a; 一般情况下&#xff0c;编译器可以自动推断出lambda表达式的返回类型&#xff0c;所以我们可以不指定返回类型。 但是如果函数体内有多个return语…

维修ABB示教器主板DSQC679 3HAC 033624-001 /R机器人液晶显示屏

ABB 全面的 6 轴关节型机器人产品组合为物料搬运、机器维护、点焊、弧焊、切割、组装、测试、检查、分配、研磨和抛光应用提供了理想的解决方案。 ABB 的协作机器人适用于各种规模的操作中的各种任务。它们易于设置、编程、操作和扩展。由行业领先的专家打造。并由业内最广泛的…

Nacos如何实现负载均衡?

作为一名资深的架构师&#xff0c;我深知在微服务架构中&#xff0c;负载均衡是确保系统高可用性、可扩展性和性能的关键技术之一。Nacos作为一款动态服务发现、配置和服务管理平台&#xff0c;为微服务架构中的负载均衡提供了强大的支持。接下来&#xff0c;我将结合我的实践经…

速盾:cdn加速技术原理

CDN&#xff08;Content Delivery Network&#xff09;加速技术是一种基于分布式部署的网络加速方案&#xff0c;旨在提高用户访问网页或者应用程序的响应速度和稳定性。它通过将内容缓存在离用户最近的边缘节点上&#xff0c;实现就近访问&#xff0c;从而减少了传输延迟和网络…

584. 寻找用户推荐人

584. 寻找用户推荐人 题目链接&#xff1a;584. 寻找用户推荐人 代码如下&#xff1a; # Write your MySQL query statement below select name from Customer where referee_id is null or referee_id<>2;

Mamba:7 VENI VIDI VICI

若在阅读过程中有些知识点存在盲区&#xff0c;可以回到如何优雅的谈论大模型重新阅读。另外斯坦福2024人工智能报告解读为通识性读物。若对于如果构建生成级别的AI架构则可以关注AI架构设计。技术宅麻烦死磕LLM背后的基础模型。 序列模型的效率与有效性之间的权衡取决于状态编…

Android动画与视图绘制流程的关系

Android动画主要分为三种&#xff1a;帧动画、View动画&#xff08;补间动画&#xff09;、属性动画。每种动画的实现原理和它们与视图绘制流程&#xff08;测量、布局和绘制&#xff09;之间的关系如下&#xff1a; 1. 帧动画&#xff08;Frame Animation&#xff09; 帧动画…

实锤,阿里云盾会拦截百度云防护的IP!

今天凌晨&#xff0c;一位站长联系上云加速客服&#xff0c;反馈说&#xff0c;网站突然出现了502的情况。 在检查云防护子域名配置没有问题、本地强制回源没有问题的情况下&#xff0c;我们得出结论是要么服务器内防火墙拦截了云防护的IP段&#xff0c;要么服务器商拦截了云防…

分布式计算、并行计算、网格计算、边缘计算

分布式计算 分布式计算是一种计算方法&#xff0c;它将一个大型的计算任务分解成多个子任务&#xff0c;并将这些子任务分布在网络上的多台计算机&#xff08;节点&#xff09;上同时执行。这些节点通过通信网络协同工作&#xff0c;共同完成任务。每个节点可以独立处理自己的…

[muduo网络库]——muduo库EventLoopThread类(剖析muduo网络库核心部分、设计思想)

接着之前我们[muduo网络库]——muduo库Thread类&#xff08;剖析muduo网络库核心部分、设计思想&#xff09;&#xff0c;我们接下来继续看muduo库中的EventLoopThread类&#xff0c;它和Thread类息息相关。 EventLoopThread类 封装了eventloop线程也就是IO线程&#xff0c;e…

如何使用AzurEnum快速枚举Microsoft Entra ID(Azure AD)

AzurEnum是一款针对Azure的安全工具&#xff0c;在该工具的帮助下&#xff0c;广大研究人员可以轻松快速地枚举Microsoft Entra ID&#xff08;Azure AD&#xff09;。 该工具基于纯Python 3开发&#xff0c;可以在Windows和Linux系统上运行&#xff0c;但考虑到性能和稳定性&a…

CSS字体修饰

1&#xff09;文字大小 &#xff08; font-size &#xff09; /* 设置文字大小为24个像素 */ font-size: 24px; 2&#xff09;字体粗细 &#xff08; font-weight &#xff09; /* 字体粗细在100-900之间可以进行调整 */ /* 字体加粗 */ font-weight: bolder; /* 或 fon…

FFmpeg开发笔记(二十八)Linux环境给FFmpeg集成libxvid

XviD是个开源的视频编解码器&#xff0c;它与DivX一同被纳入MPEG-4规范第二部分的视频标准&#xff0c;但DivX并未开源。早期的MP4视频大多采用XviD或者DivX编码&#xff0c;当时的视频格式被称作MPEG-4。现在常见的H.264后来才增补到MPEG-4规范的第十部分&#xff0c;当然如今…

远程桌面如何配置?使用快解析远程访问

远程桌面如何设置&#xff1f; 远程桌面作为windows系统内置的一个组件&#xff0c;多年来深受用户喜爱。使用此功能&#xff0c;我们能够轻而易举的控制我们想要控制的电脑。下面我就简单的介绍一下远程桌面的设置方法。 在讲具体设置方法之前&#xff0c;首先应该给大家普及…