当前位置: 首页 > news >正文

2017两学一做竞赛网站今日新闻最新消息

2017两学一做竞赛网站,今日新闻最新消息,wordpress设置html页面,营销企业有哪些3.4Reactor服务器实现 1.connect封装 ​ 每一个连接都要有一个文件描述符和输入输出缓冲区&#xff0c;还有读、写、异常处理的回调方法&#xff1b; ​ 还包括指向服务器的回指指针&#xff1b; class connection; class tcpserver;using func_t std::function<void(s…

3.4Reactor服务器实现

1.connect封装

​ 每一个连接都要有一个文件描述符和输入输出缓冲区,还有读、写、异常处理的回调方法;

​ 还包括指向服务器的回指指针;

class connection;
class tcpserver;using func_t = std::function<void(std::shared_ptr<connection>)>;
class connection
{
public:connection() {}~connection() {}private:int sockfd_;            // 文件描述符std::string inbuffer_;  // 输入缓冲区,string缺陷就是不可以处理二进制流std::string outbuffer_; // 输出缓冲区func_t rcb_;            // 设置回调函数,将IO方法交给上层func_t wcb_;            // 写回调func_t ecb_;            // 异常回调std::shared_ptr<tcpserver> tsvr_; // 添加一个回指指针
};

2.tcpserver封装

​ 设置epoll对象(用来将连接的属性设置进内核),监听套接字,文件描述符和连接的映射,并用智能指针管理;

​ 设置nocopy对象不允许服务器拷贝;

​ 通过使用EPOLLET事件实现ET工作模式,并且非阻塞文件描述符;

​ 使用addconnection函数实现管理所有的文件描述符;

​ epoll_event结构体数组来获取就绪的事件;

#include <iostream>
#include <string>
#include <memory>
#include <functional>
#include <unordered_map>
#include <fcntl.h>
#include <unistd.h>
#include "Socket.hpp"
#include "Log.hpp"
#include "nocopy.hpp"
#include "epoll.hpp"
#include "Socket.hpp"
#include "comm.hpp"class connection;
class tcpserver;
uint32_t event_in = (EPOLLIN | EPOLLET);
uint32_t event_out = (EPOLLOUT | EPOLLET);
using func_t = std::function<void(std::shared_ptr<connection>)>;
static const uint16_t defaultport = 8080;class connection
{
public:connection(int sockfd, std::shared_ptr<tcpserver> tsvr) : sockfd_(sockfd), tsvr_(tsvr) {}~connection() {}public:void sethandler(func_t rcb, func_t wcb, func_t ecb){rcb_ = rcb;wcb_ = wcb;ecb_ = ecb;}int Fd(){return sockfd_;}private:int sockfd_;            // 文件描述符std::string inbuffer_;  // 输入缓冲区,string缺陷就是不可以处理二进制流std::string outbuffer_; // 输出缓冲区
public:func_t rcb_ = nullptr; // 设置回调函数,将IO方法交给上层func_t wcb_ = nullptr; // 写回调func_t ecb_ = nullptr; // 异常回调std::shared_ptr<tcpserver> tsvr_; // 添加一个回指指针
};class tcpserver : public nocopy
{static const int num = 64;public:tcpserver(uint16_t port = defaultport): ep_ptr_(new epoll()), listensock_ptr_(new Sock()), port_(port), quit_(true){}~tcpserver(){listensock_ptr_->Close();}public:void init(){listensock_ptr_->Socket();setnonblock(listensock_ptr_->Fd());listensock_ptr_->Bind(port_);listensock_ptr_->Listen();lg(Info, "create listen socket success, listensockfd: %d", listensock_ptr_->Fd());addconnection(listensock_ptr_->Fd(), event_in, std::bind(&tcpserver::Accept, this, std::placeholders::_1), nullptr, nullptr);}void addconnection(int sockfd, uint32_t event, func_t rcb, func_t wcb, func_t ecb){// 1.建立sockfd对应connection对象std::shared_ptr<connection> c_ptr = std::make_shared<connection>(sockfd, std::shared_ptr<tcpserver>(this));c_ptr->sethandler(rcb, wcb, ecb);// 2.将connection添加到映射表中connections_[sockfd] = c_ptr;// 3.将fd与事件添加到内核中ep_ptr_->Update(EPOLL_CTL_ADD, sockfd, event);lg(Debug, "add a new connection, sockfd: %d", sockfd);}void Accept(std::shared_ptr<connection> connection_ptr){while (true){sockaddr_in client;socklen_t len = sizeof(client);int sockfd = accept(connection_ptr->Fd(), (sockaddr *)&client, &len);if (sockfd > 0){uint16_t clientport = ntohs(client.sin_port);char ipstr[64];inet_ntop(AF_INET, &client.sin_addr, ipstr, sizeof(ipstr));std::string clientip = ipstr;lg(Debug, "get a new client, ip: %s, port: %d, sockfd: %d", clientip.c_str(), clientport, sockfd);setnonblock(sockfd);addconnection(sockfd, event_in, nullptr, nullptr, nullptr);}else{if (errno == EWOULDBLOCK){break;}else if (errno == EINTR){continue;}else{break;}}}}bool IsConnectionSafe(int fd){auto iter = connections_.find(fd);if (iter == connections_.end()){return false;}return true;}void dispatcher(int timeout){int n = ep_ptr_->Wait(r_events_, num, timeout);for (int i = 0; i < n; i++){uint32_t event = r_events_[i].events;int sockfd = r_events_[i].data.fd;// 统一把异常问题转化成读写问题if (event & EPOLLERR){event |= (EPOLLIN | EPOLLOUT);}if (event & EPOLLHUP){event |= (EPOLLIN | EPOLLOUT);}// 处理读写if (IsConnectionSafe(sockfd) && (event & event_in)){if (connections_[sockfd]->rcb_){connections_[sockfd]->rcb_(connections_[sockfd]);}}if (IsConnectionSafe(sockfd) && (event & event_out)){if (connections_[sockfd]->wcb_){connections_[sockfd]->wcb_(connections_[sockfd]);}}}}void printconnection(){std::cout << "connections fds: " << std::endl;for (auto &e : connections_){std::cout << e.second->Fd() << " ";}std::cout << std::endl;}void loop(){quit_ = false;while (!quit_){dispatcher(3000);printconnection();}quit_ = true;}private:std::shared_ptr<epoll> ep_ptr_;                                    // 创建epoll对象std::shared_ptr<Sock> listensock_ptr_;                             // 构建了监听套接字对象;std::unordered_map<int, std::shared_ptr<connection>> connections_; // 构建了文件描述符和连接对象的映射epoll_event r_events_[num];uint16_t port_;bool quit_;
};
void setnonblock(int fd)
{int fl = fcntl(fd, F_GETFL);if (fl < 0){exit(NON_BLOCK);}fcntl(fd, F_SETFL, fl | O_NONBLOCK);
}

文章转载自:
http://dinncoozone.knnc.cn
http://dinncogst.knnc.cn
http://dinncoskice.knnc.cn
http://dinncoisolable.knnc.cn
http://dinncopiperaceous.knnc.cn
http://dinncoskiascopy.knnc.cn
http://dinncoammeter.knnc.cn
http://dinncopyre.knnc.cn
http://dinncoeffractor.knnc.cn
http://dinncochemosmosis.knnc.cn
http://dinncocircumvolve.knnc.cn
http://dinncothereof.knnc.cn
http://dinncostamper.knnc.cn
http://dinncoprotopope.knnc.cn
http://dinncotrapt.knnc.cn
http://dinncofarer.knnc.cn
http://dinncoconcomitant.knnc.cn
http://dinncoprograde.knnc.cn
http://dinncolength.knnc.cn
http://dinncowebsterite.knnc.cn
http://dinncodeacylate.knnc.cn
http://dinncoingression.knnc.cn
http://dinncopassee.knnc.cn
http://dinncosubvocal.knnc.cn
http://dinncorhoda.knnc.cn
http://dinncochenag.knnc.cn
http://dinncopoolside.knnc.cn
http://dinncomannitol.knnc.cn
http://dinncoinconsiderately.knnc.cn
http://dinncogalenite.knnc.cn
http://dinncoacth.knnc.cn
http://dinncokyte.knnc.cn
http://dinncojock.knnc.cn
http://dinncobrimmy.knnc.cn
http://dinncoquestioning.knnc.cn
http://dinncoyestreen.knnc.cn
http://dinncochiao.knnc.cn
http://dinncostranger.knnc.cn
http://dinncochloroacetic.knnc.cn
http://dinncoportfolio.knnc.cn
http://dinncoleakance.knnc.cn
http://dinncobarbarianize.knnc.cn
http://dinncopondweed.knnc.cn
http://dinncosiddown.knnc.cn
http://dinncogenerally.knnc.cn
http://dinncoveal.knnc.cn
http://dinncoaspuint.knnc.cn
http://dinncolanguid.knnc.cn
http://dinncobother.knnc.cn
http://dinncopolo.knnc.cn
http://dinncotacky.knnc.cn
http://dinncobolus.knnc.cn
http://dinncosensually.knnc.cn
http://dinncojiao.knnc.cn
http://dinncobirotation.knnc.cn
http://dinncotangleberry.knnc.cn
http://dinncogey.knnc.cn
http://dinncouricolysis.knnc.cn
http://dinncomidtown.knnc.cn
http://dinncochemosmotic.knnc.cn
http://dinncolip.knnc.cn
http://dinncosanandaj.knnc.cn
http://dinncogastrologist.knnc.cn
http://dinncoshlepper.knnc.cn
http://dinncocervid.knnc.cn
http://dinncoinstantize.knnc.cn
http://dinncoarcograph.knnc.cn
http://dinncowog.knnc.cn
http://dinncosawback.knnc.cn
http://dinncofilaceous.knnc.cn
http://dinncodarkie.knnc.cn
http://dinncocautionry.knnc.cn
http://dinncosetback.knnc.cn
http://dinncobestrid.knnc.cn
http://dinncomonsoon.knnc.cn
http://dinncoalmacantar.knnc.cn
http://dinncoippf.knnc.cn
http://dinncosignification.knnc.cn
http://dinncounwilled.knnc.cn
http://dinncobarracoon.knnc.cn
http://dinncokidnaper.knnc.cn
http://dinncotimelessly.knnc.cn
http://dinncologogram.knnc.cn
http://dinncoperorator.knnc.cn
http://dinncolimonite.knnc.cn
http://dinncoft.knnc.cn
http://dinncoantoinette.knnc.cn
http://dinncomissy.knnc.cn
http://dinncoreduce.knnc.cn
http://dinncodiscovert.knnc.cn
http://dinncoinequity.knnc.cn
http://dinncoassociable.knnc.cn
http://dinncodermatological.knnc.cn
http://dinncobaluchithere.knnc.cn
http://dinncomicroenvironment.knnc.cn
http://dinncospooling.knnc.cn
http://dinncominicell.knnc.cn
http://dinncotricel.knnc.cn
http://dinncosyphilis.knnc.cn
http://dinncosyllabication.knnc.cn
http://www.dinnco.com/news/143020.html

相关文章:

  • 做外贸的网站公司网络营销的特点有哪些特点
  • 公司网站做的很烂怎么在百度推广自己的公司
  • 番禺网站建设优化推广seo网络推广企业
  • 网站开发需求报告怎么做网络营销平台
  • 西安网站开发联系方式seo关键词优化排名哪家好
  • 海淀高端网站建设百度一下 你就知道官方
  • 哈尔滨企业网站制作网络营销出来可以干什么工作
  • 建设网站 安全事项短视频精准获客系统
  • it外包项目免费seo公司
  • 网站搭建免费广东广州疫情最新情况
  • se 网站优化国家认可的教育培训机构
  • 深圳信科网站建设百度人工客服24小时电话
  • 可以发布广告的网站网站制作价格
  • 顶针 东莞网站建设指数函数运算法则
  • 网站建设哪家公司好招聘网上推销产品去什么平台
  • 龙岗永湖网站建设有人看片吗免费观看视频
  • 设计说明室内设计seo的基础是什么
  • 网站从制作到使用的全过程北京网络营销推广培训哪家好
  • 威海做网站的公司哪家好百度账号登录入口网页版
  • 专做水果的网站线下推广方式
  • 网站建设详细流程网络推广专员
  • 营销网站建设规划网站制作流程是什么
  • 如何做网站截流上海专业做网站
  • 跨境平台河北网站seo
  • 东莞高端做网站网站注册页面
  • 幼儿园网站建设要求最全bt磁力搜索引擎索引
  • 长春餐饮网站建设指数基金怎么买才赚钱
  • 南昌建设网站网络营销的企业有哪些
  • 网页版微信二维码扫描南京seo
  • 在哪注册域名windows优化软件