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

相关文章

mysql中的服务器架构详解

《mysql中的服务器架构详解》:本文主要介绍mysql中的服务器架构,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、mysql服务器架构解释3、总结1、背景简单理解一下mysqphpl的服务器架构。2、mysjsql服务器架构解释mysql的架

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

Linux如何快速检查服务器的硬件配置和性能指标

《Linux如何快速检查服务器的硬件配置和性能指标》在运维和开发工作中,我们经常需要快速检查Linux服务器的硬件配置和性能指标,本文将以CentOS为例,介绍如何通过命令行快速获取这些关键信息,... 目录引言一、查询CPU核心数编程(几C?)1. 使用 nproc(最简单)2. 使用 lscpu(详细信

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

MySQL 打开binlog日志的方法及注意事项

《MySQL打开binlog日志的方法及注意事项》本文给大家介绍MySQL打开binlog日志的方法及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、默认状态二、如何检查 binlog 状态三、如何开启 binlog3.1 临时开启(重启后失效)

Java实现删除文件中的指定内容

《Java实现删除文件中的指定内容》在日常开发中,经常需要对文本文件进行批量处理,其中,删除文件中指定内容是最常见的需求之一,下面我们就来看看如何使用java实现删除文件中的指定内容吧... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细介绍3.1 Ja

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

MySQL MCP 服务器安装配置最佳实践

《MySQLMCP服务器安装配置最佳实践》本文介绍MySQLMCP服务器的安装配置方法,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下... 目录mysql MCP 服务器安装配置指南简介功能特点安装方法数据库配置使用MCP Inspector进行调试开发指

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4

Python UV安装、升级、卸载详细步骤记录

《PythonUV安装、升级、卸载详细步骤记录》:本文主要介绍PythonUV安装、升级、卸载的详细步骤,uv是Astral推出的下一代Python包与项目管理器,主打单一可执行文件、极致性能... 目录安装检查升级设置自动补全卸载UV 命令总结 官方文档详见:https://docs.astral.sh/