当前位置: 首页 > news >正文

webserver服务器从零搭建到上线(六)|Timestamp类和InetAddress类

本节我们重点来谈论:
时间类和我们的初始化链接地址类

文章目录

  • Timestamp类
    • 成员函数实现
  • InetAddress类
    • 具体实现

Timestamp类

我们为什么要封装一个时间类呢?

这也是一个大型项目必须的基础组建,这样我们不仅可以提高代码的可读性,并且封装细节避免了直接操作时间时可能引发的错误,提高代码的健壮性。

//时间类
class Timestamp {
public:Timestamp();explicit Timestamp(int64_t microSecondsSinceEpoch_);//返回当前时间-长整形static Timestamp now();//将长整型转换为年月日字符串std::string toString() const;
private:int64_t microSecondsSinceEpoch_;
};

时间类的作用主要就是以上几个:

  • 获取当前时间,返回值是一个长整型
  • 长整型转换为年月日

调用方式应为:

int main () {cout << Timestamp::now().toString() << endlreturn 0;
}

成员函数实现

#include "Timestamp.h"#include <time.h>Timestamp::Timestamp(): microSecondsSinceEpoch_(0) {}Timestamp::Timestamp(int64_t microSecondsSinceEpoch): microSecondsSinceEpoch_(microSecondsSinceEpoch){}Timestamp Timestamp::now()
{//返回对象实例,对象成员变量是当前的 int64_treturn Timestamp(time(NULL));
}std::string Timestamp::toString() const
{char buf[128] = { 0 };tm *tm_time = localtime(&microSecondsSinceEpoch_);snprintf(buf, 128, "%4d/%02d/%02d %02d:%02d:%02d", tm_time->tm_year + 1900, tm_time->tm_mon + 1,tm_time->tm_mday,tm_time->tm_hour,tm_time->tm_min,tm_time->tm_sec);return buf;
}

time(NULL)返回一个 64 位整数,是自 Unix 纪元(1970 年 1 月 1 日 00:00:00 UTC)以来的时间,变量类型为int64_t

InetAddress类

该类也比较简单,就是封装 socket 地址的类型

class InetAddress {
public:explicit InetAddress(uint16_t port, std::string ip = "127.0.0.1");explicit InetAddress(const sockaddr_in &addr): addr_(addr){}std::string toIP() const;std::string toIpPort() const;uint16_t toPort() const;const sockaddr_in* getSockAddr() const {return &addr_;}private:sockaddr_in addr_;
};
  • toIP()返回 InetAddress 对象中存储的 IP 地址的字符串表示
  • toIpPort()返回 InetAddress 对象中存储的 IP 地址和端口号的字符串表示,格式为 IP:Port
  • toPort()返回 InetAddress 对象中存储的端口号。
  • getSockAddr()返回指向内部 sockaddr_in 结构体的指针,方便在其他网络操作中使用。
  • 私有成员变量 sockaddr_in addr_:存储 IP 地址和端口号的结构体,包含了网络地址信息。

该类的主要作用就是:

  • 提供对 IP 地址和端口号的封装,便于在网络编程中管理和使用;
  • 提供方便的方法来获取和表示网络地址和端口的信息;
  • 通过提供的函数,能够轻松地转换地址和端口信息为字符串格式,便于调试和日志记录。

具体实现

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());
}std::string InetAddress::toIP() const
{//addr_char buf[64] = {0};::inet_ntop(AF_INET, &addr_.sin_addr, buf, sizeof buf);return buf;
}std::string InetAddress::toIpPort() const
{//ip: portchar buf[64] = {0};::inet_ntop(AF_INET, &addr_.sin_addr, buf, sizeof buf);size_t end = strlen(buf);uint16_t port = ntohs(addr_.sin_port);sprintf(buf+end, ":%u", port);return buf;
}uint16_t InetAddress::toPort() const
{return ntohs(addr_.sin_port);
}

我们可以看出,构造函数已经为我们封装好了sockaddr_in的配置,我们只需要传入ip和port即可

然后这里主要解释几个函数:

const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);inet_ntop(AF_INET, &addr_.sin_addr, buf, sizeof buf);

inet_ntop 是一个用于将网络地址转换为字符串表示的函数.

af:地址族,通常为 AF_INET(表示 IPv4)或 AF_INET6(表示 IPv6)。
src:指向存储有IP的结构体。
dst:指向用于存储转换后的字符串的缓冲区。
size:缓冲区的大小。

int sprintf(char *str, const char *format, ...);sprintf(buf + end, ":%u", port);

sprintf 是一个 C 标准库函数,用于将格式化的数据写入字符串中。

这里的buf+end其实就是接着之前写进去的ip后面继续写port端口。

相关文章:

webserver服务器从零搭建到上线(六)|Timestamp类和InetAddress类

本节我们重点来谈论&#xff1a; 时间类和我们的初始化链接地址类 文章目录 Timestamp类成员函数实现 InetAddress类具体实现 Timestamp类 我们为什么要封装一个时间类呢&#xff1f; 这也是一个大型项目必须的基础组建&#xff0c;这样我们不仅可以提高代码的可读性&#xf…...

【Java】一文看懂Thread 线程池的 7 种创建方式、任务队列及自定义线程池(代码示例)

本文摘要&#xff1a;【Java】Thread 线程池的 7 种创建方式及自定义线程池&#xff08;代码示例版&#xff09; &#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专…...

【SpringBoot】四种读取 Spring Boot 项目中 jar 包中的 resources 目录下的文件

本文摘要&#xff1a;四种读取 Spring Boot 项目中 jar 包中的 resources 目录下的文件 &#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。公粽号&#xf…...

掌控未来,爱普生SR3225SAA用于汽车钥匙、射频电路的智慧引擎

为了响应市场需求&#xff0c;Epson使用独家QMEMS*2技术所生产的石英振荡器&#xff0c;与其精巧的半导体技术所制造的射频传输器电路&#xff0c;开发了SR3225SAA。不仅内建的石英震荡器之频率误差仅有2 ppm&#xff0c;更使其封装尺寸达仅3.2 mm x 2.5 mm&#xff0c;为客户大…...

第五届武汉纺织大学ACM程序设计竞赛 个人题解(待补完)

前言&#xff1a; 上周周日教练要求打的一场重现赛&#xff0c;时长五个小时&#xff0c;题目难度还行&#xff0c;除了部分题目前我还写不出来之外&#xff0c;大部分题都写完或补完了&#xff0c;这边给出比赛链接和我的代码&#xff08;有些是队友的&#xff09;和题解。 正…...

LeetCode---哈希表

242. 有效的字母异位词 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数都相同&#xff0c;则称 s 和 t 互为字母异位词。 代码示例&#xff1a; //时间复杂度: O(n) //空间复杂度: O(1) c…...

Python知识点13---面向对象的编程

提前说一点&#xff1a;如果你是专注于Python开发&#xff0c;那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了&#xff0c;而如果你和作者一样只是操作其他技术的Python API那就足够了。 Python是一个完全面向对象开发的语言&#xff0c;它的一切都以对象的…...

Android Dialog软键盘弹出问题完美解决办法

一、问题&#xff1a; Dialog中有输入框时&#xff0c;显示后无法自动弹起软键盘&#xff0c;原因就不赘述了&#xff0c;自行Google。 一、解决办法&#xff1a; 开启独立线程&#xff0c;线程中使用while循环&#xff0c;循环调用弹起软键盘方法&#xff0c;直至showSoftI…...

【C++】C++入门1.0

鼠鼠最近在学C&#xff0c;那么好&#xff0c;俺来做笔记了&#xff01; 目录 1.C关键字(C98) 2.命名空间 2.1.命名空间定义 2.2.命名空间的使用 3.C的输入&&输出 4.缺省参数 4.1缺省参数概念 4.2.缺省参数的分类 5.函数重载 5.1.函数重载概念 5.2.C支持函数…...

springboot实现文件上传功能,整合云服务

文章目录 这是springboot案例的,文件上传功能的拆分,本篇将带大家彻底了解文件上传功能,先从本地存储再到云存储,全网最详细版本,保证可以学会,可以了解文件上传功能的开发文件上传功能剖析进行书写一个小的文件上传文件上传的文件三要素首先表单提交的方式要是 post方式,第二个…...

接口interfance的基本使用

一.为什么有接口&#xff1f; 接口:就是一种规则。 二.接口的定义和使用 1.接口用关键字interface来定义 public interface 接口名{} 2.接口不能实例化 3.接口和类之间是实现关系,通过implements关键字表示 4.接口的子类(实现类) 注意1&#xff1a; 接口和类的实现关系…...

Gitlub如何删除分支(删除远程分支+本地分支)

目录 背景 删除方法 总结 背景 想要删除自己在本地创建的并已上传到远程分支中的分支。 删除方法 1&#xff09;删除远程分支 git push origin --delete brannchname 2&#xff09;删除本地分支 先切换到其他分支 git checkout otherbranch 删除本地分支 git bran…...

使用RSA算法加密字符串:从基础到实现 - Python

在现代数据安全中&#xff0c;加密算法起着至关重要的作用。特别是非对称加密算法&#xff0c;如RSA&#xff08;Rivest-Shamir-Adleman&#xff09;&#xff0c;广泛应用于保护敏感信息的传输。本文将详细介绍如何使用RSA算法加密和解密字符串&#xff0c;包括生成密钥对、加密…...

MFC实现守护进程,包括开机自启动、进程单例、进程查询、进程等待、重启进程、关闭进程

在Windows平台上实现一个守护进程&#xff0c;由于与系统有关&#xff0c;所有使用MFC来实现是最合适的&#xff0c;被守护的进程则不限语言。废话不多&#xff0c;直接开整。 目录 1. 开机自启动 2. 进程单例 3. 进程查询 4. 进程等待 5. 重启进程 6. 关闭进程 7、最后…...

Spark SQL数据源 - Parquet文件

当使用Spark SQL处理Parquet文件时&#xff0c;你可以使用spark.read.parquet()方法从文件系统中加载Parquet数据到一个DataFrame中。Parquet是一种列式存储格式&#xff0c;非常适合用于大数据集&#xff0c;因为它提供了高效的压缩和编码方案。 以下是一个简单的例子&#x…...

eNsp——两台电脑通过一根网线直连通信

一、拓扑结构 二、电脑配置 ip和子网掩码&#xff0c;配置两台电脑处于同一网段 三、测试 四、应用 传文件等操作&#xff0c;可以在一台电脑上配置FTP服务器...

杂牌记录仪TS视频流恢复方法

大多数的记录仪都采用了MP4/MOV文件方案&#xff0c;极少数的可能在用AVI文件&#xff0c;极极少数的在用TS文件方案。很多人可能不太解TS文件&#xff0c;这是一种古老的视频文件结构&#xff0c;下边这个案例我们来看下TS视频文件的恢复方法。 故障存储:8G存储卡/fat32文件系…...

十_信号7-信号集

int sigemptyset(sigset_t *set); 清空信号集 int sigfillset(sigset_t *set); 填充满 信号集 int sigaddset(sigset_t *set, int signum); 向信号集中添加信号 int sigdelset(sigset_t *set, int signum); 从型号集中删除信号 int sigismember(const sigset_t *set, int s…...

GPT-4o

微软最新发布的CopilotPC采用了OpenAI最新的GPT-4o技术&#xff0c;新增了多项强大功能。以下是主要的新增功能&#xff1a; 更强大的AI处理能力&#xff1a;CopilotPC采用了专门用于AI处理的特殊芯片&#xff0c;使得电脑能够处理更多的人工智能任务&#xff0c;而无需调用云…...

32位与64位程序下函数调用的异同——计科学习中缺失的内容

前言 今天&#xff0c;通过一个有趣的案例&#xff0c;从反编译的角度看一下C语言中函数参数是如何传递的。 创建main.c文件&#xff0c;将下面实验代码拷贝到main.c文件中。 # main.c #include <stdio.h>int test(int a, int b, int c, int d, int e, int f, int g, …...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...