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.hqwc.cn/news/175103.html

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

相关文章

Leetcode—122.买卖股票的最佳时机II【中等】

2023每日刷题&#xff08;二十八&#xff09; Leetcode—122.买卖股票的最佳时机II 实现代码 int maxProfit(int* prices, int pricesSize) {int totalProfit 0;if(pricesSize < 1) {return 0;}for(int i 1; i < pricesSize; i) {if(prices[i] - prices[i - 1] > …

The 8th China Open Source Conference Successfully Concludes

由开源社主办的第八届中国开源年会&#xff08;COSCon23&#xff09;于 2023年10月29日在成都圆满收官。本次大会&#xff0c;为期两天&#xff0c;线下参会报名逾千人次&#xff0c;在线直播观看人数总计 168610 人&#xff0c;直播观看次数达 248725 次&#xff0c;官网累计浏…

使用VScode编译betaflight固件--基于windows平台

使用VScode编译betaflight固件--基于windows平台 1、使用git克隆betaflight的开源代码2、betaflight的代码框架分析&#xff1a;3、配置编译环境&#xff1a;4、VScode上编译 betaflight不仅可以在LInux上进行编译也可以在Windows上编译&#xff0c;本文主要介绍在windows平台上…

建设大型综合运维平台,对接集成多厂商网管系统

当前&#xff0c;云计算、大数据、人工智能等IT技术迅猛发展&#xff0c;企业的信息化步入了一个崭新的时代&#xff0c;企业规模不断壮大&#xff0c;业务不断拓展&#xff0c;企业信息化依赖的网络结构和IT技术越来越复杂。因建设时期等原因&#xff0c;企业网络中分布着不同…

实现线程的多种方式锁的介绍ThreadLocal线程池 详细总结(下)

本文主要介绍线程池的基本使用 上述其他介绍在上一篇文章中&#xff1a;实现线程的多种方式&锁的介绍&ThreadLocal&线程池 详细总结&#xff08;上&#xff09;-CSDN博客 线程池 5.1、为什么使用线程池 线程池可以看做是管理了 N 个线程的池子&#xff0c;和连…

asp.net实验管理系统VS开发sqlserver数据库web结构c#编程web网页设计

一、源码特点 asp.net 实验管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语言开发。 asp.net实验管理系统1 应用技术&am…

Control的Invoke和BeginInvoke

近日&#xff0c;被Control的Invoke和BeginInvoke搞的头大&#xff0c;就查了些相关的资料&#xff0c;整理如下。感谢这篇文章对我的理解Invoke和BeginInvoke的真正含义 。 (一&#xff09;Control的Invoke和BeginInvoke 我们要基于以下认识&#xff1a; &#xff08;1&#x…

【Java】线程的调度、生命周期及状态转换

&#x1f33a;个人主页&#xff1a;Dawn黎明开始 &#x1f380;系列专栏&#xff1a;Java ⭐每日一句&#xff1a;夜色难免黑凉&#xff0c;前行必有曙光 &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️ ​ 文章目录 一.&…

冲击900亿美元估值!邀约路演、秘密交表的Shein上市有望

双十一的狂欢刚刚结束&#xff0c;Shein即将赴美上市的消息又在电商圈里投下一枚重磅炸弹。 继被媒体曝光其寻求900亿美金估值后&#xff0c;最新的消息称其已邀请投资人参与路演&#xff0c;且已秘密完成交表。这个神秘的中国独角兽&#xff0c;离敲钟登陆美股的日子越来越近…

如何实现Redisson分布式锁

首先&#xff0c;不要将分布式锁想的太复杂&#xff0c;如果我们只是平时业务中去使用&#xff0c;其实不算难&#xff0c;但是很多人写的文章不能让人快速上手&#xff0c;接下来&#xff0c;一起看下Redisson分布式锁的快速实现 Redisson 是一个在 Redis 的基础上实现的 Java…

Mozilla 面向基于 Debian 的 Linux 发行版

导读Mozilla 公司今天发布新闻稿&#xff0c;表示面向 Debian、Ubuntu 和 Linux Mint 等基于 Debian 的发行版&#xff0c;推出了.deb 格式的 Firefox Nightly 浏览器安装包&#xff0c;便于用户在上述发行版中更轻松地安装。 本次更新的亮点之一在于采用 APT 存储库&#xff0…

think5和fastadmin验证规则的使用

在fastadmin中使用验证规则只需要两步即可 第一步 首先在控制器中开启验证规则 protected $modelValidatetrue;//开启验证规则protected $modelSceneValidatetrue;//开启场景验证第二步 在 app\admin\validate 和控制器对应的 validate 中添加 验证规则以及场景验证 <?…