muduo源码剖析之InetAddress

InetAddress

InetAddress 类是 muduo 网络库中的一个重要类,用于表示网络中的 IP 地址和端口号。

InetAddress 类在 muduo 网络库中被广泛使用,用于表示网络中的通信实体的地址信息,例如服务器地址、客户端地址等。通过 InetAddress 类,我们可以方便地操作 IP 地址和端口号,实现网络通信的功能。

源码比较简单,已经编写详细注释

源码剖析

InetAddress.h

// Copyright 2010, Shuo Chen.  All rights reserved.
// http://code.google.com/p/muduo/
//
// Use of this source code is governed by a BSD-style license
// that can be found in the License file.// Author: Shuo Chen (chenshuo at chenshuo dot com)
//
// This is a public header file, it must only include public header files.#ifndef MUDUO_NET_INETADDRESS_H
#define MUDUO_NET_INETADDRESS_H#include "muduo/base/copyable.h"
#include "muduo/base/StringPiece.h"#include <netinet/in.h>namespace muduo
{
namespace net
{
namespace sockets
{
const struct sockaddr* sockaddr_cast(const struct sockaddr_in6* addr);
}///
/// Wrapper of sockaddr_in.
///
/// This is an POD interface class.
class InetAddress : public muduo::copyable
{public:/// Constructs an endpoint with given port number./// Mostly used in TcpServer listening.explicit InetAddress(uint16_t port = 0, bool loopbackOnly = false, bool ipv6 = false);/// Constructs an endpoint with given ip and port./// @c ip should be "1.2.3.4"InetAddress(StringArg ip, uint16_t port, bool ipv6 = false);/// Constructs an endpoint with given struct @c sockaddr_in/// Mostly used when accepting new connectionsexplicit InetAddress(const struct sockaddr_in& addr): addr_(addr){ }explicit InetAddress(const struct sockaddr_in6& addr): addr6_(addr){ }//返回addr_地址成员变量的协议族sa_family_t family() const { return addr_.sin_family; }//获取ip地址的点十分进制的字符串string toIp() const;//获取ip地址和port端口的点十分进制的字符串string toIpPort() const;//获取端口号(本机字节序)uint16_t port() const;// default copy/assignment are Okay//返回sockaddr结构体指针const struct sockaddr* getSockAddr() const { return sockets::sockaddr_cast(&addr6_); }//设置SockAddrvoid setSockAddrInet6(const struct sockaddr_in6& addr6) { addr6_ = addr6; }//获取ip地址(网络字节序)uint32_t ipv4NetEndian() const;//获取端口号(网络字节序)uint16_t portNetEndian() const { return addr_.sin_port; }// resolve hostname to IP address, not changing port or sin_family// return true on success.// thread safe//通过主机名解析出ip地址static bool resolve(StringArg hostname, InetAddress* result);// static std::vector<InetAddress> resolveAll(const char* hostname, uint16_t port = 0);// set IPv6 ScopeID//设置ipv6地址的作用域范围。void setScopeId(uint32_t scope_id);private:union{//ipv4struct sockaddr_in addr_;//ipv6struct sockaddr_in6 addr6_;};
};}  // namespace net
}  // namespace muduo#endif  // MUDUO_NET_INETADDRESS_H

InetAddress.cc

// Copyright 2010, Shuo Chen.  All rights reserved.
// http://code.google.com/p/muduo/
//
// Use of this source code is governed by a BSD-style license
// that can be found in the License file.// Author: Shuo Chen (chenshuo at chenshuo dot com)#include "muduo/net/InetAddress.h"#include "muduo/base/Logging.h"
#include "muduo/net/Endian.h"
#include "muduo/net/SocketsOps.h"#include <netdb.h>
#include <netinet/in.h>// INADDR_ANY use (type)value casting.
#pragma GCC diagnostic ignored "-Wold-style-cast"
static const in_addr_t kInaddrAny = INADDR_ANY;
static const in_addr_t kInaddrLoopback = INADDR_LOOPBACK;
#pragma GCC diagnostic error "-Wold-style-cast"//     /* Structure describing an Internet socket address.  */
//     struct sockaddr_in {
//         sa_family_t    sin_family; /* address family: AF_INET */
//         uint16_t       sin_port;   /* port in network byte order */
//         struct in_addr sin_addr;   /* internet address */
//     };//     /* Internet address. */
//     typedef uint32_t in_addr_t;
//     struct in_addr {
//         in_addr_t       s_addr;     /* address in network byte order */
//     };//     struct sockaddr_in6 {
//         sa_family_t     sin6_family;   /* address family: AF_INET6 */
//         uint16_t        sin6_port;     /* port in network byte order */
//         uint32_t        sin6_flowinfo; /* IPv6 flow information */
//         struct in6_addr sin6_addr;     /* IPv6 address */
//         uint32_t        sin6_scope_id; /* IPv6 scope-id */
//     };using namespace muduo;
using namespace muduo::net;static_assert(sizeof(InetAddress) == sizeof(struct sockaddr_in6),"InetAddress is same size as sockaddr_in6");
static_assert(offsetof(sockaddr_in, sin_family) == 0, "sin_family offset 0");
static_assert(offsetof(sockaddr_in6, sin6_family) == 0, "sin6_family offset 0");
static_assert(offsetof(sockaddr_in, sin_port) == 2, "sin_port offset 2");
static_assert(offsetof(sockaddr_in6, sin6_port) == 2, "sin6_port offset 2");InetAddress::InetAddress(uint16_t portArg, bool loopbackOnly, bool ipv6)
{static_assert(offsetof(InetAddress, addr6_) == 0, "addr6_ offset 0");static_assert(offsetof(InetAddress, addr_) == 0, "addr_ offset 0");if (ipv6){memZero(&addr6_, sizeof addr6_);addr6_.sin6_family = AF_INET6;in6_addr ip = loopbackOnly ? in6addr_loopback : in6addr_any;addr6_.sin6_addr = ip;addr6_.sin6_port = sockets::hostToNetwork16(portArg);}else{memZero(&addr_, sizeof addr_);addr_.sin_family = AF_INET;in_addr_t ip = loopbackOnly ? kInaddrLoopback : kInaddrAny;addr_.sin_addr.s_addr = sockets::hostToNetwork32(ip);addr_.sin_port = sockets::hostToNetwork16(portArg);}
}InetAddress::InetAddress(StringArg ip, uint16_t portArg, bool ipv6)
{if (ipv6 || strchr(ip.c_str(), ':')){memZero(&addr6_, sizeof addr6_);sockets::fromIpPort(ip.c_str(), portArg, &addr6_);}else{memZero(&addr_, sizeof addr_);sockets::fromIpPort(ip.c_str(), portArg, &addr_);}
}string InetAddress::toIpPort() const
{char buf[64] = "";sockets::toIpPort(buf, sizeof buf, getSockAddr());return buf;
}string InetAddress::toIp() const
{char buf[64] = "";sockets::toIp(buf, sizeof buf, getSockAddr());return buf;
}uint32_t InetAddress::ipv4NetEndian() const
{assert(family() == AF_INET);return addr_.sin_addr.s_addr;
}uint16_t InetAddress::port() const
{return sockets::networkToHost16(portNetEndian());
}static __thread char t_resolveBuffer[64 * 1024];bool InetAddress::resolve(StringArg hostname, InetAddress* out)
{assert(out != NULL);struct hostent hent;struct hostent* he = NULL;int herrno = 0;memZero(&hent, sizeof(hent));//通过主机名解析出ip地址int ret = gethostbyname_r(hostname.c_str(), &hent, t_resolveBuffer, sizeof t_resolveBuffer, &he, &herrno);if (ret == 0 && he != NULL){assert(he->h_addrtype == AF_INET && he->h_length == sizeof(uint32_t));out->addr_.sin_addr = *reinterpret_cast<struct in_addr*>(he->h_addr);return true;}else{if (ret){LOG_SYSERR << "InetAddress::resolve";}return false;}
}void InetAddress::setScopeId(uint32_t scope_id)
{if (family() == AF_INET6){addr6_.sin6_scope_id = scope_id;}
}

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

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

相关文章

第14章,lambda表达式与流处理例题

package 例题;import java.util.List; import java.util.stream.Collectors; import java.util. stream.Stream;public class 例题19 { public static void main(String[] args){List<例题14> list 例题14.get例题14List();//获取公共类的测试数据Stream<例题14>…

Win11 Edge浏览器进入朔日考试系统(无纸化测评系统)的方法

Win11 Edge浏览器进入朔日考试系统&#xff08;无纸化测评系统&#xff09;的方法 笔记本型号&#xff1a;联想 使用浏览器&#xff1a;edge浏览器 操作系统&#xff1a;Windows11 网址&#xff1a;http://172.31.0.139/WZHEDU/ 注意:使用此方法打开edge浏览器会频繁出现弹窗&a…

派金SDK接入文档

一、接入SDK 1、将sdk文件手动导入到目标项目中&#xff0c;如下图所示&#xff1a; 2、该SDK需接入其他三方广告&#xff0c;通过pod的方式接入&#xff0c;在Profile中加入如下代码&#xff1a; pod GDTMobSDK, ~> 4.14.40pod BaiduMobAdSDK, ~> 5.313pod KSAdSDK…

猫罐头怎么选?千万别错过这5款好吃放心的猫罐头推荐!

猫罐头不仅美味可口&#xff0c;而且营养丰富&#xff0c;是专为猫咪打造的美食。那么&#xff0c;猫罐头怎么选&#xff1f;作为一位经营宠物店7年的店长&#xff0c;我对猫猫的饮食都非常重视&#xff0c;也见证了很多猫咪品尝各种猫罐头的瞬间&#xff0c;现在我对各个品牌的…

0基础学习VR全景平台篇第119篇:利用蒙版航拍补天 - PS教程

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01; 嗨&#xff0c;大家好。欢迎收看蛙色VR系列教程之PS利用蒙版航拍补天。 我们之前已经教过大家如何进行航拍调色&#xff0c;不知道大家学的怎么样呢&#xff1f; 会不会发现&…

VS Code+DevChat助力非专业开发也能玩转代码编程

一、前言 偶然间网上瞎逛&#xff0c;看到DevChat 发布了一款 VS Code 插件&#xff0c;可提供类似chatgpt一样的“一站式 AI 辅助编程”体验。据说&#xff0c; DevChat 直接对接 GPT-4 还让免费用&#xff0c;目前免费注册收邮件即可获取key&#xff0c;再也不用麻烦的外部手…

使用EasyExcel时踩过的坑

目录 一、问题描述二、使用EasyExcel的版本三、场景复现四、问题修复 一、问题描述 使用EasyExcel读取文件数据时&#xff0c;出现数据无法读取情况。 二、使用EasyExcel的版本 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel&l…

Flink(二)【Flink 部署模式】

前言 今天是Flink学习的第二天&#xff0c;我的心情异常的复杂哈哈哈&#xff08;苦笑&#xff09;&#xff0c;学习上还是比较顺利的&#xff0c;感情上我并不擅长&#xff0c;所以心情波动大在所难免。害&#xff0c;至少还有学习让我不被各种糟糕琐碎的日常生活里的人和事所…

Python(四)字符串

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

Vue3指令

Vue 指令&#xff08;Directives&#xff09;是 Vue.js 的一项核心功能&#xff0c;它们可以在 HTML 模板中以 v- 开头的特殊属性形式使用&#xff0c;用于将响应式数据绑定到 DOM 元素上或在 DOM 元素上进行一些操作。 Vue 指令是带有前缀 v- 的特殊 HTML 属性&#xff0c;它赋…

c语言练习第10周(1~5)

根据公式求和 输入样例20输出样例 534.188884 #include<stdio.h> #include<math.h> int main() {int i,n;scanf("%d", &n);double s 0,t0;for (i 1; i < n; i) {t t sqrt(i);s s t;}printf("%.6lf", s);return 0; } 第一行输入…

获取AAC音频的ADTS固定头部信息

文章目录 前言一、AAC音频中的ADTS二、解析ADTS信息1.标准文档中介绍2.解析3.采样率索引和值4.下载AAC标准文档 前言 调试嵌入式设备中播放aac音频的过程中&#xff0c;了解了aac音频格式&#xff0c;记录在此&#xff0c;防止遗忘。 一、AAC音频中的ADTS ADTS&#xff08;Audi…

深度学习 opencv python 实现中国交通标志识别 计算机竞赛

文章目录 0 前言1 yolov5实现中国交通标志检测2.算法原理2.1 算法简介2.2网络架构2.3 关键代码 3 数据集处理3.1 VOC格式介绍3.2 将中国交通标志检测数据集CCTSDB数据转换成VOC数据格式3.3 手动标注数据集 4 模型训练5 实现效果5.1 视频效果 6 最后 0 前言 &#x1f525; 优质…

思谋科技进博首秀:工业多模态大模型IndustryGPT V1.0正式发布

大模型技术正在引领新一轮工业革命&#xff0c;但将其应用于工业制造&#xff0c;仍面临许多挑战&#xff0c;专业知识的缺乏是关键难点。11月5日&#xff0c;香港中文大学终身教授、思谋科技创始人兼董事长贾佳亚受邀参加第六届中国国际进口博览会暨虹桥国际经济论坛开幕式。虹…

物联网水表电子阀工作原理是怎样的?

随着科技的不断发展&#xff0c;物联网技术逐渐深入到我们的生活之中。作为智能家居的重要组成部分&#xff0c;物联网水表电子阀凭借其智能化、节能环保等优势&#xff0c;受到了越来越多用户的青睐。接下来&#xff0c;合众小编将来为大家介绍下物联网水表电子阀工作原理。 一…

《面纱》细嚼的句子

记住&#xff0c;履行职责并不值得称道 因为那是你应该做的&#xff0c;就像手脏了该洗手一样。唯有一点颇为重要&#xff0c;那就是爱你的职责。当爱和职责合而为一时&#xff0c;上天就会降恩典于你&#xff0c;让你享受到你连想都不敢想的无边的幸福。——《面纱》 所谓“道…

FreeRTOS五种内存管理详解

freeRTOS五种内存管理详解 heap1 源码分析 void * pvPortMalloc( size_t xWantedSize ) {void * pvReturn NULL; // 申请的内存地址static uint8_t * pucAlignedHeap NULL; // 用于指向堆内存的起始地址#if ( portBYTE_ALIGNMENT ! 1 ) // 如果对齐为1则不对齐&#xff0c…

SpringBoot实现mysql与clickhouse多数据源

一、我们来实现一个mysql与clickhouse多数据源配置 二、数据源配置 # 指定服务名称 spring:application:name: demobigdatadatasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/db?createDatabaseIfNotExisttrue&useUnicodetrue&…

2023云栖大会,Salesforce终敲开中国CRM市场

2015年被视为中国CRM SaaS元年&#xff0c;众多CRM SaaS创业公司和厂商在Salesforce的榜样作用下涌入了CRM SaaS赛道。在全球市场&#xff0c;Salesforce是CRM SaaS领域的领导厂商&#xff0c;连续多年占据了全球CRM SaaS第一大厂商地位。然而&#xff0c;Salesforce作为业务类…

leetcode刷题日记:100.Same Tree(相同的树)和101.Symmetric Tree(对称二叉树)

100.Same Tree(相同的树) 题目给了我们两棵树要我们判断这两颗树是否相同&#xff0c;我首先想到的就是前序序列与中序序列可以唯一确定一棵树&#xff0c;如果我能分别确定这两棵树的前序序列与中序序列&#xff0c;然后再分别比较它们的前序序列与中序序列就能得到这两棵树是…