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

相关文章

ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法

《ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法》本文介绍了Elasticsearch的基本概念,包括文档和字段、索引和映射,还详细描述了如何通过Docker... 目录1、ElasticSearch概念2、ElasticSearch、Kibana和IK分词器部署

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

Linux流媒体服务器部署流程

《Linux流媒体服务器部署流程》文章详细介绍了流媒体服务器的部署步骤,包括更新系统、安装依赖组件、编译安装Nginx和RTMP模块、配置Nginx和FFmpeg,以及测试流媒体服务器的搭建... 目录流媒体服务器部署部署安装1.更新系统2.安装依赖组件3.解压4.编译安装(添加RTMP和openssl模块

如何解决Pycharm编辑内容时有光标的问题

《如何解决Pycharm编辑内容时有光标的问题》文章介绍了如何在PyCharm中配置VimEmulator插件,包括检查插件是否已安装、下载插件以及安装IdeaVim插件的步骤... 目录Pycharm编辑内容时有光标1.如果Vim Emulator前面有对勾2.www.chinasem.cn如果tools工

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

Spring Boot整合log4j2日志配置的详细教程

《SpringBoot整合log4j2日志配置的详细教程》:本文主要介绍SpringBoot项目中整合Log4j2日志框架的步骤和配置,包括常用日志框架的比较、配置参数介绍、Log4j2配置详解... 目录前言一、常用日志框架二、配置参数介绍1. 日志级别2. 输出形式3. 日志格式3.1 PatternL

JavaWeb-WebSocket浏览器服务器双向通信方式

《JavaWeb-WebSocket浏览器服务器双向通信方式》文章介绍了WebSocket协议的工作原理和应用场景,包括与HTTP的对比,接着,详细介绍了如何在Java中使用WebSocket,包括配... 目录一、概述二、入门2.1 POM依赖2.2 编写配置类2.3 编写WebSocket服务2.4 浏

查询SQL Server数据库服务器IP地址的多种有效方法

《查询SQLServer数据库服务器IP地址的多种有效方法》作为数据库管理员或开发人员,了解如何查询SQLServer数据库服务器的IP地址是一项重要技能,本文将介绍几种简单而有效的方法,帮助你轻松... 目录使用T-SQL查询方法1:使用系统函数方法2:使用系统视图使用SQL Server Configu

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

开启mysql的binlog日志步骤详解

《开启mysql的binlog日志步骤详解》:本文主要介绍MySQL5.7版本中二进制日志(bin_log)的配置和使用,文中通过图文及代码介绍的非常详细,需要的朋友可以参考下... 目录1.查看是否开启bin_log2.数据库会把日志放进logs目录中3.查看log日志总结 mysql版本5.71.查看