sylar高性能服务器-日志(P69)内容记录

2024-03-13 16:44

本文主要是介绍sylar高性能服务器-日志(P69)内容记录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • p69:SocketStream封装
      • class Stream
        • 基本读写操作
        • readFixSize
        • writeFixSize
      • class SocketStream
        • 成员函数
        • read
      • write

p69:SocketStream封装

基于之前写的序列化模块封装了读和写,但是socketAPI并不保证一定能够写或读到规定的字节数,所以封装了readFixSizewriteFixSize保证一定操作规定字节的数据。

class Stream

基本读写操作
// 读操作,保存到buffer中
virtual int read(void* buffer, size_t length) = 0;
// 读操作,保存到ByteArray中
virtual int read(ByteArray::ptr ba, size_t length) = 0;
// 写操作,从buffer中写
virtual int write(const void* buffer, size_t length) = 0;
// 写操作,从ByteArray中写
virtual int write(ByteArray::ptr ba, size_t length) = 0;
readFixSize
// 读固定长度的数据,读取到内存
int Stream::readFixSize(void* buffer, size_t length) {// 偏移量size_t offset = 0;// 读取长度int64_t left = length;while(left > 0) {// len表示已经读取的数据大小int64_t len = read((char*)buffer + offset, left);// 异常if(len <= 0) {return len;}// 更新偏移量offset += len;// 更新剩余读取长度left -= len;}// 返回读取到内存中的数据长度return length;
}// 读固定长度的数据,读取到ByteArray 因为ByteArray对象内部有一个位置指针,所以不需要手动更新偏移量
int Stream::readFixSize(ByteArray::ptr ba, size_t length) {int64_t left = length;while(left > 0) {int64_t len = read(ba, left);if(len <= 0) {return len;}left -= len;}return length;
}
writeFixSize
// 写固定长度的数据,从内存写
int Stream::writeFixSize(const void* buffer, size_t length) {size_t offset = 0;int64_t left = length;while(left > 0) {int64_t len = write((const char*)buffer + offset, left);if(len <= 0) {return len;}offset += len;left -= len;}return length;}// 写固定长度的数据,从ByteArray写
int Stream::writeFixSize(ByteArray::ptr ba, size_t length) {int64_t left = length;while(left > 0) {int64_t len = write(ba, left);if(len <= 0) {return len;}left -= len;}return length;
}

class SocketStream

成员函数
/// Socket类
Socket::ptr m_socket;
/// 是否主控
bool m_owner;
read
// 读数据,读取到内存
int SocketStream::read(void* buffer, size_t length) {if(!isConnected()) {return -1;}return m_socket->recv(buffer, length);
}// 读数据,读取到ByteArray
int SocketStream::read(ByteArray::ptr ba, size_t length) {if(!isConnected()) {return -1;}std::vector<iovec> iovs;ba->getWriteBuffers(iovs, length);int rt = m_socket->recv(&iovs[0], iovs.size());if(rt > 0) {ba->setPosition(ba->getPosition() + rt);}return rt;
}

write

int SocketStream::write(const void* buffer, size_t length) {if(!isConnected()) {return -1;}return m_socket->send(buffer, length);
}int SocketStream::write(ByteArray::ptr ba, size_t length) {if(!isConnected()) {return -1;}std::vector<iovec> iovs;ba->getReadBuffers(iovs, length);int rt = m_socket->send(&iovs[0], iovs.size());if(rt > 0) {ba->setPosition(ba->getPosition() + rt);}return rt;
}

这篇关于sylar高性能服务器-日志(P69)内容记录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/805518

相关文章

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

SpringBoot日志级别与日志分组详解

《SpringBoot日志级别与日志分组详解》文章介绍了日志级别(ALL至OFF)及其作用,说明SpringBoot默认日志级别为INFO,可通过application.properties调整全局或... 目录日志级别1、级别内容2、调整日志级别调整默认日志级别调整指定类的日志级别项目开发过程中,利用日志

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

Linux搭建ftp服务器的步骤

《Linux搭建ftp服务器的步骤》本文给大家分享Linux搭建ftp服务器的步骤,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录ftp搭建1:下载vsftpd工具2:下载客户端工具3:进入配置文件目录vsftpd.conf配置文件4:

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

C#高效实现Word文档内容查找与替换的6种方法

《C#高效实现Word文档内容查找与替换的6种方法》在日常文档处理工作中,尤其是面对大型Word文档时,手动查找、替换文本往往既耗时又容易出错,本文整理了C#查找与替换Word内容的6种方法,大家可以... 目录环境准备方法一:查找文本并替换为新文本方法二:使用正则表达式查找并替换文本方法三:将文本替换为图

Linux查询服务器 IP 地址的命令详解

《Linux查询服务器IP地址的命令详解》在服务器管理和网络运维中,快速准确地获取服务器的IP地址是一项基本但至关重要的技能,下面我们来看看Linux中查询服务器IP的相关命令使用吧... 目录一、hostname 命令:简单高效的 IP 查询工具命令详解实际应用技巧注意事项二、ip 命令:新一代网络配置全

java -jar example.jar 产生的日志输出到指定文件的方法

《java-jarexample.jar产生的日志输出到指定文件的方法》这篇文章给大家介绍java-jarexample.jar产生的日志输出到指定文件的方法,本文给大家介绍的非常详细,对大家的... 目录怎么让 Java -jar example.jar 产生的日志输出到指定文件一、方法1:使用重定向1、