C/C++轻量级并发TCP服务器框架Zinx-框架开发001: 读取标准输入,回显到标准输出

文章目录

  • 完整代码实现参考-非项目使用
  • 项目使用的代码 - 乱-但是思路与上面的相同
    • 创建Kernel类
    • 添加删除修改epoll,才能写run方法
    • 创建stdin_Channel类
    • 在Kernel类中实现run方法

在这里插入图片描述
在这里插入图片描述

完整代码实现参考-非项目使用

#include <errno.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/epoll.h>
#include <iostream>
#include <string>
using namespace std;///stdin_channel类
class stdin_channel{
public:bool ReadFd(string &_input){cin >> _input;}
};///zinx_kernel类
class zinx_kernel{stdin_channel m_channel;
public:int iEpollFd;bool Add_Channel(stdin_channel &_channel){bool bRet = false;struct epoll_event stEvent;stEvent.events = EPOLLIN;stEvent.data.ptr = &_channel;if (0 == epoll_ctl(iEpollFd, EPOLL_CTL_ADD, 0, &stEvent)){m_channel = _channel;bRet = true;}return bRet;}void Del_Channel(stdin_channel &_channel){epoll_ctl(iEpollFd, EPOLL_CTL_DEL, 0, NULL);}bool run(){int iEpollRet = -1;for (;;){struct epoll_event atmpEvent[100];iEpollRet = epoll_wait(iEpollFd, atmpEvent, 100, -1);if (-1 == iEpollRet){if (EINTR == errno){continue;}else{break;}}for (int i = 0; i < iEpollRet; i++){stdin_channel *poChannel = static_cast<stdin_channel *>(atmpEvent[i].data.ptr);if (0 != (EPOLLIN & atmpEvent[i].events)){string input;poChannel->ReadFd(input);cout << input <<endl;}}}}
};///主函数
int main()
{zinx_kernel z;stdin_channel s;z.iEpollFd = epoll_create(1);z.Add_Channel(s);z.run();}

项目使用的代码 - 乱-但是思路与上面的相同

Zinxkernel类中引入Channel类

定义一个channel对象,并设置get和set方法。

在stdinChannel类中实现一个ReadFd方法。

创建Kernel类

定义一个channel对象,并设置get和set方法。
但是set方法不适用epoll,应该是添加通道到epoll里,所以使用Addchannel

#pragma once#include "stdin_channel.h"
#include "Ichannel.h"class zinxkernel
{stdin_channel *m_channel = nullptr;zinxkernel();virtual ~zinxkernel();static zinxkernel kernel;
public:void run();// 删除set方法void AddChannel(Ichannel *_pChannel);void DelChannel(Ichannel *_pChannel);void ModChannel_AddOut(Ichannel *_pChannel);void ModChannel_DelOut(Ichannel *_pChannel);stdin_channel *GetChannel(){return m_channel;}static zinxkernel &GetInstance(){return kernel;}
};

添加删除修改epoll,才能写run方法

void zinxkernel::AddChannel(Ichannel * _pChannel)
{if (true == _pChannel->init()){//将参数和文件描述符0关联起来(epoll_ctl)struct epoll_event stEvent;stEvent.events = EPOLLIN;stEvent.data.ptr = _pChannel;epoll_ctl(m_epollFd, EPOLL_CTL_ADD, _pChannel->GetFd(), &stEvent);}
}void zinxkernel::DelChannel(Ichannel * _pChannel)
{epoll_ctl(m_epollFd, EPOLL_CTL_DEL, _pChannel->GetFd(), NULL);_pChannel->fini();
}void zinxkernel::ModChannel_AddOut(Ichannel * _pChannel)
{struct epoll_event stEvent;stEvent.events = EPOLLIN | EPOLLOUT;stEvent.data.ptr = _pChannel;epoll_ctl(m_epollFd, EPOLL_CTL_MOD, _pChannel->GetFd(), &stEvent);
}void zinxkernel::ModChannel_DelOut(Ichannel * _pChannel)
{struct epoll_event stEvent;stEvent.events = EPOLLIN;stEvent.data.ptr = _pChannel;epoll_ctl(m_epollFd, EPOLL_CTL_MOD, _pChannel->GetFd(), &stEvent);
}

创建stdin_Channel类

std::string stdin_channel::ReadFd()
{std::string ret;std::cin >> ret;return ret;
}

在Kernel类中实现run方法

1 等输入epoll
在哪里创建epoll fd?
在kernel的构造函数中创建。

zinxkernel::zinxkernel()
{int fd = epoll_create(1);if (fd >= 0){m_epollFd = fd;}
}zinxkernel::~zinxkernel()
{if (-1 != m_epollFd){close(m_epollFd);}
}

等输入

		struct epoll_event astEvents[200];int ready_count = epoll_wait(m_epollFd, astEvents, 200, -1);if (0 == ready_count){if (EINTR == errno){continue;}}

2 调用输出通道的读取函数

		//2调用通道的读取函数或写出函数for (int i = 0; i < ready_count; i++){if (0 != (astEvents[i].events & EPOLLIN)){// 3 回显到标准输出cout<<xxxxx}}
int main()
{stdin_channel in_channel;zinxkernel &kernel = zinxkernel::GetInstance();kernel.AddChannel(&in_channel);kernel.run();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/142574.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024上海国际智能驾驶技术展览会(自动驾驶展)

2024上海国际智能驾驶技术展览会 2024 Shanghai International Autonomous driving Expo 时间&#xff1a;2024年3月26-28日 地点&#xff1a;上海跨国采购会展中心 随着科技的飞速发展&#xff0c;智能驾驶已经成为了汽车行业的重要趋势。在这个时代背景下&#xff0c;汽车不…

Ansys Lumerical | 用于增强现实系统的表面浮雕光栅

在本示例中&#xff0c;我们使用 RCWA 求解器设计了一个斜面浮雕光栅 (SRG)&#xff0c;它将用于将光线耦合到单色增强现实 (AR) 系统的波导中。光栅的几何形状经过优化&#xff0c;可将正常入射光导入-1 光栅阶次。 然后我们将光栅特性导出为 Lumerical Sub-Wavelength Model …

数字媒体技术基础之:常见图片文件格式

在数字图像处理和图形设计领域&#xff0c;了解不同的图片文件格式及其特点是至关重要的。每种格式都有其独特的用途和优势。以下介绍一些最常见的图片文件格式。 JPEG Joint Photographic Experts Group 扩展名&#xff1a;.jpg 或 .jpeg 特点&#xff1a; 1、有损压缩&#x…

【Proteus仿真】【51单片机】拔河游戏设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用按键、LED、动态数码管模块等。 主要功能&#xff1a; 系统运行后&#xff0c;指示灯处于中间位置&#xff0c;数码管显示得分0&#xff0c;当按下…

20231114在HP笔记本的ubuntu20.04系统下向RealmeQ手机发送PDF文件

20231114在HP笔记本的ubuntu20.04系统下向RealmeQ手机发送PDF文件 2023/11/14 14:11 手机&#xff1a;Realme Q 笔记本电脑&#xff1a;HP https://item.jd.com/100012583174.html 惠普&#xff08;HP&#xff09;战66 三代AMD版 14英寸轻薄笔记本电脑&#xff08;锐龙7nm 六核…

多维时序 | MATLAB实现PSO-LSTM-Attention粒子群优化长短期记忆神经网络融合注意力机制的多变量时间序列预测

多维时序 | MATLAB实现PSO-LSTM-Attention粒子群优化长短期记忆神经网络融合注意力机制的多变量时间序列预测 目录 多维时序 | MATLAB实现PSO-LSTM-Attention粒子群优化长短期记忆神经网络融合注意力机制的多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果…

数据拟合、参数估计、插值等数据处理算法

介绍 数据拟合&#xff1a; 数据拟合是通过选择或构建合适的函数模型&#xff0c;将给定的数据点与该函数模型进行匹配和拟合的过程。常见的数据拟合方法包括最小二乘法和非线性最小二乘法。最小二乘法通过最小化实际数据与拟合函数的残差平方和来求解最优拟合参数。非线性最小…

HTTP/2.0协议详解

前言 HTTP/2.0&#xff1a;互联网通信的革新标准 随着互联网技术的飞速发展&#xff0c;HTTP协议作为互联网应用最广泛的通信协议&#xff0c;也在不断演进和优化。HTTP/2.0是HTTP协议的最新版本&#xff0c;它旨在提供更高效、更安全、更快速的互联网连接。 一、HTTP/2.0的…

第一篇 《随机点名答题系统》简介及设计流程图(类抽奖系统、在线答题系统、线上答题系统、在线点名系统、线上点名系统、在线考试系统、线上考试系统)

专栏目录 第一篇 《随机点名答题系统》简介及设计流程图&#xff08;类抽奖系统、在线答题系统、线上答题系统、在线点名系统、线上点名系统、在线考试系统、线上考试系统&#xff09;-CSDN博客 第二篇 《随机点名答题系统》——题库管理详解&#xff08;类抽奖系统、在线答题…

Redis04-分布式锁

目录 Redis实现分布式锁 分布式锁的工作流程 Redis实现分布式锁 Redission的watch dog Redis分布式锁的合理应用 Redis实现分布式锁 在单节点的服务器中&#xff0c;java中的synchronized机制是处于JVM层面的&#xff0c;只能保证线程之间的同步。而实际的服务部署中&…

Spark SQL编程

1. Spark SQL概述 1.1 什么是Spark SQL Spark SQL是用于结构化数据处理的Spark模块。与基本的Spark RDD API不同&#xff0c;Spark SQL提供的接口为Spark提供了有关数据结构和正在执行的计算的更多信息。在内部&#xff0c;Spark SQL使用这些额外的信息来执行额外的优化。与Spa…

解析SQL 获取表、字段及SQL查询参数

解析SQL 获取表、字段及SQL查询参数 1. 执行效果2. 使用2.1 引入依赖2.2 相关实体2.3 工具类 1. 执行效果 2. 使用 2.1 引入依赖 <!-- sql 解析处理--><dependency><groupId>com.github.jsqlparser</groupId><artifactId>jsqlparser</artifa…

「实用场景教程」如何用日程控件DHTMLX Scheduler制作酒店预订日历?(一)

dhtmlxScheduler是一个类似于Google日历的JavaScript日程安排控件&#xff0c;日历事件通过Ajax动态加载&#xff0c;支持通过拖放功能调整事件日期和时间&#xff0c;事件可以按天&#xff0c;周&#xff0c;月三个种视图显示。 DHTMLX Scheduler正式版下载 在本教程中&…

K8S的基础知识

K8S的意义与入门 专有名词 容器:包含了运行一个应用程序所需要的所有东西,包括:代码、运行时、各种依赖和配置。pod:K8s调度的最小单元,包含一个或多个容器。一个容器组中的容器具有紧密耦合性,共享资源,存储空间和IP。即同一个容器组中的容器可以通过localhost:xxx访问…

windows系统pycharm程序通过urllib下载权重https报错解决

报错内容&#xff1a; raise URLError(unknown url type: %s % type) urllib.error.URLError: <urlopen error unknown url type: https> 解决办法记录&#xff1a; 1. 下载 pyopenssl : pip install pyopenssl 此时&#xff0c; import ssl 可以通过提示指导你安…

简单地聊一聊Spring Boot的构架

前言 本文小编将详细解析Spring Boot框架&#xff0c;并通过代码举例说明每个层的作用。我们将深入探讨Spring Boot的整体架构&#xff0c;包括展示层、业务逻辑层和数据访问层。通过这些例子&#xff0c;读者将更加清晰地了解每个层在应用程序中的具体作用。通过代码实例&…

Uniapp开发 购物商城源码 在线电商商城源码 适配移动终端项目及各小程序

lilishop电商商城系统 商城移动端&#xff0c;使用Uniapp开发&#xff0c;可编译为所有移动终端项目及各小程序 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88487579 源码下载2&#xff1a;关注我留言

0基础学习VR全景平台篇第121篇:认识视频剪辑软件Premiere

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01; 大家好&#xff0c;这节课是带领大家认识认识我们的剪辑软件Premiere&#xff0c;一般简称是PR。 &#xff08;PR界面&#xff09; 我们首先打开PR&#xff0c;第一步就是要创建…

深入理解JVM虚拟机第二十五篇:详解JVM方法的绑定机制静态绑定和动态绑定,早期绑定晚期绑定,并编写代码从字节码角度证明这件事情

大神链接&#xff1a;作者有幸结识技术大神孙哥为好友&#xff0c;获益匪浅。现在把孙哥视频分享给大家。 孙哥链接&#xff1a;孙哥个人主页 作者简介&#xff1a;一个颜值99分&#xff0c;只比孙哥差一点的程序员 本专栏简介&#xff1a;话不多说&#xff0c;让我们一起干翻J…