仿muduo库实现高并发服务器--日志的书写和套接字Socket的实现
目录一、日志的书写二、套接字Socket的实现一、日志的书写我们直接使用宏来实现日志我们将日志的等级分为三个等级 : INF DBG ERR首先设置什么等级的日志可以打印以便区别测试版本和上线版本使用time函数来获取时间戳 local 将时间戳转化成当前时间struct tm 储存拆分后的结构体strftime按照对应的格式转化成字符串fprintf向标准输出打印 stdout 标准输出%s ts %s FILE %s LINEformat是日志宏的自定义格式参数比如你传的 这是一条日志数字% d\n换行符让每条日志单独一行。##__VA_ARGS__GCC 扩展语法代表「可变参数列表」比如你传的 123, test##是为了处理没有可变参数的情况避免编译错误。二、套接字Socket的实现成员变量文件描述符成员函数创建套接字bool Creat() { _sockfd socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (_sockfd 0) { ERR_LOG(CREAT SOCKET FAILED); return false; } return true; }绑定套接字bool Bind(const std::string ip, uint16_t port) { struct sockaddr_in addr; addr.sin_family AF_INET;//设置为ipv4 addr.sin_port htons(port);//转化为大端口 addr.sin_addr.s_addr inet_addr(ip.c_str());//将点分十进制转化为32字节的整数 socklen_t len sizeof(struct sockaddr_in); int ret bind(_sockfd, (struct sockaddr *)addr, len); if (ret 0) { ERR_LOG(BIND FAILED); return false; } return true; }监听#define MAX_LISTEN 10 bool Listen(int backlog MAX_LISTEN) { int ret listen(_sockfd, backlog); if (ret 0) { ERR_LOG(LISTEN FAILED); return false; } return true; }链接bool Connect(const std::string ip, uint16_t port) { struct sockaddr_in addr; addr.sin_family AF_INET; addr.sin_port htons(port); addr.sin_addr.s_addr inet_addr(ip.c_str()); socklen_t len sizeof(struct sockaddr_in); int ret connect(_sockfd, (struct sockaddr *)addr, len); if (ret 0) { ERR_LOG(Connect FAILED); return false; } return true; }接收链接int Accpet() { int newfd accept(_sockfd, NULL, NULL); if (newfd 0) { ERR_LOG(ACCEPT FAILE); return -1; } return newfd; }读取数据ssize_t Recv(void *buf, size_t len, int flag 0) { ssize_t ret recv(_sockfd, buf, len, flag); if (ret 0) { if (errno EAGAIN || errno EINTR) { return 0; } ERR_LOG(RECV FAILED); return -1; } return ret; }读取设置为非阻塞ssize_t NonBlockRecv(void *buf, size_t len) // { return Recv(buf, len, MSG_DONTWAIT); // MSG_DONTWAIT为非阻塞 }发送数据ssize_t Send(const void *buf, size_t len, int flag 0) { ssize_t ret send(_sockfd, buf, len, flag); if (ret 0) { if (errno EAGAIN || errno EINTR) { return 0; } ERR_LOG(SEND FAILED); return -1; } return ret; }发送设置为非阻塞ssize_t NonBlockSend(void *buf, size_t len) { if (len 0) return 0; return Send(buf, len, MSG_DONTWAIT); }关闭链接void Close() { if (_sockfd ! -1) { close(_sockfd); } _sockfd -1; }开启地址重用void ReuseAddress() { int val 1; // 端口 setsockopt(_sockfd, SOL_SOCKET, SO_REUSEADDR, (void *)val, sizeof(int)); val 1; // 接口 setsockopt(_sockfd, SOL_SOCKET, SO_REUSEPORT, (void *)val, sizeof(int)); }套接字设置为非阻塞void NonBlock() { int flag fcntl(_sockfd, F_GETFL, 0); // 不能覆盖 fcntl(_sockfd, F_SETFL, flag | O_NONBLOCK); }创建服务端bool CreatServer(uint16_t port, const std::string ip 0.0.0.0) { if (Creat() false) return false; ReuseAddress(); NonBlock(); if (Bind(ip, port) false) return false; if (Listen() false) return false; return true; }创建客户端bool CreatClient(uint16_t port, const std::string ip 0.0.0.0) { if (Creat() false) return false; if (Connect(ip, port) false) return false; return true; }整体代码class Socket { private: int _sockfd; public: Socket() : _sockfd(-1) { } Socket(int sockfd) : _sockfd(sockfd) { } int Fd() { return _sockfd; } ~Socket() { Close(); } bool Creat() { _sockfd socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (_sockfd 0) { ERR_LOG(CREAT SOCKET FAILED); return false; } return true; } bool Bind(const std::string ip, uint16_t port) { struct sockaddr_in addr; addr.sin_family AF_INET; addr.sin_port htons(port); addr.sin_addr.s_addr inet_addr(ip.c_str()); socklen_t len sizeof(struct sockaddr_in); int ret bind(_sockfd, (struct sockaddr *)addr, len); if (ret 0) { ERR_LOG(BIND FAILED); return false; } return true; } #define MAX_LISTEN 10 bool Listen(int backlog MAX_LISTEN) { int ret listen(_sockfd, backlog); if (ret 0) { ERR_LOG(LISTEN FAILED); return false; } return true; } bool Connect(const std::string ip, uint16_t port) { struct sockaddr_in addr; addr.sin_family AF_INET; addr.sin_port htons(port); addr.sin_addr.s_addr inet_addr(ip.c_str()); socklen_t len sizeof(struct sockaddr_in); int ret connect(_sockfd, (struct sockaddr *)addr, len); if (ret 0) { ERR_LOG(Connect FAILED); return false; } return true; } int Accpet() { int newfd accept(_sockfd, NULL, NULL); if (newfd 0) { ERR_LOG(ACCEPT FAILE); return -1; } return newfd; } ssize_t Recv(void *buf, size_t len, int flag 0) { ssize_t ret recv(_sockfd, buf, len, flag); if (ret 0) { if (errno EAGAIN || errno EINTR) { return 0; } ERR_LOG(RECV FAILED); return -1; } return ret; } ssize_t NonBlockRecv(void *buf, size_t len) // { return Recv(buf, len, MSG_DONTWAIT); // MSG_DONTWAIT为非阻塞 } ssize_t Send(const void *buf, size_t len, int flag 0) { ssize_t ret send(_sockfd, buf, len, flag); if (ret 0) { if (errno EAGAIN || errno EINTR) { return 0; } ERR_LOG(SEND FAILED); return -1; } return ret; } ssize_t NonBlockSend(void *buf, size_t len) { if (len 0) return 0; return Send(buf, len, MSG_DONTWAIT); } void Close() { if (_sockfd ! -1) { close(_sockfd); } _sockfd -1; } bool CreatServer(uint16_t port, const std::string ip 0.0.0.0) { if (Creat() false) return false; ReuseAddress(); NonBlock(); if (Bind(ip, port) false) return false; if (Listen() false) return false; return true; } bool CreatClient(uint16_t port, const std::string ip 0.0.0.0) { if (Creat() false) return false; if (Connect(ip, port) false) return false; return true; } // 设置套接字选项开启地址端口重用 void ReuseAddress() { int val 1; // 端口 setsockopt(_sockfd, SOL_SOCKET, SO_REUSEADDR, (void *)val, sizeof(int)); val 1; // 接口 setsockopt(_sockfd, SOL_SOCKET, SO_REUSEPORT, (void *)val, sizeof(int)); } void NonBlock() { int flag fcntl(_sockfd, F_GETFL, 0); // 不能覆盖 fcntl(_sockfd, F_SETFL, flag | O_NONBLOCK); } };

相关新闻

AI Agent 辅助工具学习 --- BMad 是什么?与 Superpowers 的区别?

AI Agent 辅助工具学习 --- BMad 是什么?与 Superpowers 的区别?

BMad Method:敏捷 AI 驱动开发的完整框架 BMad Method(Breakthrough Method for Agile AI Driven Development,也常被解读为 Build More Architect Dreams)是一套面向 AI 驱动敏捷开发的模块化框架与生态系统,具备规模…

2026/5/17 11:54:34 阅读更多 →
基于SpringBoot家政保洁预约系统设计与开发(源码+精品论文+答辩PPT等资料)

基于SpringBoot家政保洁预约系统设计与开发(源码+精品论文+答辩PPT等资料)

博主介绍:CSDN毕设辅导第一人、靠谱第一人、全网粉丝50W,csdn特邀作者、博客专家、腾讯云社区合作讲师、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交…

2026/7/3 0:18:19 阅读更多 →
Linux镜像打包-解包-使用

Linux镜像打包-解包-使用

什么是FIT FIT(Flattened Image Tree)是uboot的一种新的镜像打包方案,它是由uboot负责解析的,生成的文件名是xxx.itb,在一个itb镜像中我们可以打包进去多个内核、设备树、ramdisk的镜像,然后按照实际需求进行组合使用。他通过its文…

2026/5/17 6:59:44 阅读更多 →

最新新闻

Umi-OCR终极指南:免费离线文字识别软件的完整配置与优化教程

Umi-OCR终极指南:免费离线文字识别软件的完整配置与优化教程

Umi-OCR终极指南:免费离线文字识别软件的完整配置与优化教程 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。内置多…

2026/7/4 22:12:22 阅读更多 →
postcss-write-svg:革命性CSS SVG编写工具,让图形开发效率提升10倍!

postcss-write-svg:革命性CSS SVG编写工具,让图形开发效率提升10倍!

postcss-write-svg:革命性CSS SVG编写工具,让图形开发效率提升10倍! 【免费下载链接】postcss-write-svg Write SVGs directly in CSS 项目地址: https://gitcode.com/gh_mirrors/po/postcss-write-svg 你是否厌倦了在CSS和SVG文件之间…

2026/7/4 22:12:21 阅读更多 →
3大架构优化策略:如何构建高可用AI网关服务

3大架构优化策略:如何构建高可用AI网关服务

3大架构优化策略:如何构建高可用AI网关服务 【免费下载链接】new-api A unified AI model hub for aggregation & distribution. It supports cross-converting various LLMs into OpenAI-compatible, Claude-compatible, or Gemini-compatible formats. A cent…

2026/7/4 22:12:21 阅读更多 →
Agent Skills技能发现机制:如何让AI助手智能匹配任务与技能

Agent Skills技能发现机制:如何让AI助手智能匹配任务与技能

Agent Skills技能发现机制:如何让AI助手智能匹配任务与技能 【免费下载链接】agentskills Specification and documentation for Agent Skills 项目地址: https://gitcode.com/GitHub_Trending/ag/agentskills Agent Skills是GitHub推荐项目精选(…

2026/7/4 22:10:20 阅读更多 →
RestFB实战教程:10个常见Facebook API操作示例

RestFB实战教程:10个常见Facebook API操作示例

RestFB实战教程:10个常见Facebook API操作示例 【免费下载链接】restfb RestFB is a simple and flexible Facebook Graph API client written in Java. 项目地址: https://gitcode.com/gh_mirrors/re/restfb 想要在Java应用中快速集成Facebook功能&#xff…

2026/7/4 22:10:20 阅读更多 →
如何搭建Leela Chess Zero环境?5分钟快速启动你的AI象棋之旅

如何搭建Leela Chess Zero环境?5分钟快速启动你的AI象棋之旅

如何搭建Leela Chess Zero环境?5分钟快速启动你的AI象棋之旅 【免费下载链接】leela-chess **MOVED TO https://github.com/LeelaChessZero/leela-chess ** A chess adaption of GCPs Leela Zero 项目地址: https://gitcode.com/gh_mirrors/le/leela-chess L…

2026/7/4 22:08:18 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布,这是一个关键的安全修复版本,修复了多个方面的问题,还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出,mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器,与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻