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

写网站论文怎么做用模板建站

写网站论文怎么做,用模板建站,前端开发需要的软件,特色直播ChatServer 一个TCP服务器必然会有连接的接收,维持,收发数据等逻辑。那我们就要基于asio完成这个服务的搭建。主服务是这个样子的 #include "LogicSystem.h"#include <csignal>#include <thread>#include <mutex>#include "AsioIOServiceP…

ChatServer

一个TCP服务器必然会有连接的接收,维持,收发数据等逻辑。那我们就要基于asio完成这个服务的搭建。主服务是这个样子的

 
  1. #include "LogicSystem.h"
  2. #include <csignal>
  3. #include <thread>
  4. #include <mutex>
  5. #include "AsioIOServicePool.h"
  6. #include "CServer.h"
  7. #include "ConfigMgr.h"
  8. using namespace std;
  9. bool bstop = false;
  10. std::condition_variable cond_quit;
  11. std::mutex mutex_quit;
  12. int main()
  13. {
  14. try {
  15. auto &cfg = ConfigMgr::Inst();
  16. auto pool = AsioIOServicePool::GetInstance();
  17. boost::asio::io_context io_context;
  18. boost::asio::signal_set signals(io_context, SIGINT, SIGTERM);
  19. signals.async_wait([&io_context, pool](auto, auto) {
  20. io_context.stop();
  21. pool->Stop();
  22. });
  23. auto port_str = cfg["SelfServer"]["Port"];
  24. CServer s(io_context, atoi(port_str.c_str()));
  25. io_context.run();
  26. }
  27. catch (std::exception& e) {
  28. std::cerr << "Exception: " << e.what() << endl;
  29. }
  30. }

CServer类的声明

 
  1. #include <boost/asio.hpp>
  2. #include "CSession.h"
  3. #include <memory.h>
  4. #include <map>
  5. #include <mutex>
  6. using namespace std;
  7. using boost::asio::ip::tcp;
  8. class CServer
  9. {
  10. public:
  11. CServer(boost::asio::io_context& io_context, short port);
  12. ~CServer();
  13. void ClearSession(std::string);
  14. private:
  15. void HandleAccept(shared_ptr<CSession>, const boost::system::error_code & error);
  16. void StartAccept();
  17. boost::asio::io_context &_io_context;
  18. short _port;
  19. tcp::acceptor _acceptor;
  20. std::map<std::string, shared_ptr<CSession>> _sessions;
  21. std::mutex _mutex;
  22. };

构造函数中监听对方连接

 
  1. CServer::CServer(boost::asio::io_context& io_context, short port):_io_context(io_context), _port(port),
  2. _acceptor(io_context, tcp::endpoint(tcp::v4(),port))
  3. {
  4. cout << "Server start success, listen on port : " << _port << endl;
  5. StartAccept();
  6. }

接受连接的函数

 
  1. void CServer::StartAccept() {
  2. auto &io_context = AsioIOServicePool::GetInstance()->GetIOService();
  3. shared_ptr<CSession> new_session = make_shared<CSession>(io_context, this);
  4. _acceptor.async_accept(new_session->GetSocket(), std::bind(&CServer::HandleAccept, this, new_session, placeholders::_1));
  5. }

AsioIOServicePool

从AsioIOServicePool中返回一个可用的iocontext构造Session,然后将接受的新链接的socket写入这个Session保管。

AsioIOServicePool已经在前面讲解很多次了,它的声明如下

 
  1. #include <vector>
  2. #include <boost/asio.hpp>
  3. #include "Singleton.h"
  4. class AsioIOServicePool:public Singleton<AsioIOServicePool>
  5. {
  6. friend Singleton<AsioIOServicePool>;
  7. public:
  8. using IOService = boost::asio::io_context;
  9. using Work = boost::asio::io_context::work;
  10. using WorkPtr = std::unique_ptr<Work>;
  11. ~AsioIOServicePool();
  12. AsioIOServicePool(const AsioIOServicePool&) = delete;
  13. AsioIOServicePool& operator=(const AsioIOServicePool&) = delete;
  14. // 使用 round-robin 的方式返回一个 io_service
  15. boost::asio::io_context& GetIOService();
  16. void Stop();
  17. private:
  18. AsioIOServicePool(std::size_t size = std::thread::hardware_concurrency());
  19. std::vector<IOService> _ioServices;
  20. std::vector<WorkPtr> _works;
  21. std::vector<std::thread> _threads;
  22. std::size_t _nextIOService;
  23. };

AsioIOServicePool具体实现

 
  1. #include "AsioIOServicePool.h"
  2. #include <iostream>
  3. using namespace std;
  4. AsioIOServicePool::AsioIOServicePool(std::size_t size):_ioServices(size),
  5. _works(size), _nextIOService(0){
  6. for (std::size_t i = 0; i < size; ++i) {
  7. _works[i] = std::unique_ptr<Work>(new Work(_ioServices[i]));
  8. }
  9. //遍历多个ioservice,创建多个线程,每个线程内部启动ioservice
  10. for (std::size_t i = 0; i < _ioServices.size(); ++i) {
  11. _threads.emplace_back([this, i]() {
  12. _ioServices[i].run();
  13. });
  14. }
  15. }
  16. AsioIOServicePool::~AsioIOServicePool() {
  17. std::cout << "AsioIOServicePool destruct" << endl;
  18. }
  19. boost::asio::io_context& AsioIOServicePool::GetIOService() {
  20. auto& service = _ioServices[_nextIOService++];
  21. if (_nextIOService == _ioServices.size()) {
  22. _nextIOService = 0;
  23. }
  24. return service;
  25. }
  26. void AsioIOServicePool::Stop(){
  27. //因为仅仅执行work.reset并不能让iocontext从run的状态中退出
  28. //当iocontext已经绑定了读或写的监听事件后,还需要手动stop该服务。
  29. for (auto& work : _works) {
  30. //把服务先停止
  31. work->get_io_context().stop();
  32. work.reset();
  33. }
  34. for (auto& t : _threads) {
  35. t.join();
  36. }
  37. }

CServer的处理连接逻辑

 
  1. void CServer::HandleAccept(shared_ptr<CSession> new_session, const boost::system::error_code& error){
  2. if (!error) {
  3. new_session->Start();
  4. lock_guard<mutex> lock(_mutex);
  5. _sessions.insert(ma

文章转载自:

http://ESsryY0l.jyknk.cn
http://DDJlB1hw.jyknk.cn
http://kseADgBP.jyknk.cn
http://RDTfoKuN.jyknk.cn
http://HVdy1qMg.jyknk.cn
http://NZS5qaOZ.jyknk.cn
http://sN7CJchk.jyknk.cn
http://htGK8qSq.jyknk.cn
http://OW8beVAu.jyknk.cn
http://s6k2kffC.jyknk.cn
http://3Jg7EGyL.jyknk.cn
http://742eeBts.jyknk.cn
http://hSAy6I0l.jyknk.cn
http://hSIsEpR1.jyknk.cn
http://PWtTY5qz.jyknk.cn
http://gCpHvY12.jyknk.cn
http://nT91fGHl.jyknk.cn
http://Sfmh5nD0.jyknk.cn
http://OycifoGZ.jyknk.cn
http://Jc0gFel9.jyknk.cn
http://fRieuaZo.jyknk.cn
http://SfFEqRQt.jyknk.cn
http://9b7cfEDt.jyknk.cn
http://C7VQv9YN.jyknk.cn
http://jj2qmn4O.jyknk.cn
http://lnTUHWR9.jyknk.cn
http://0MUT2KCZ.jyknk.cn
http://8ypdtCyM.jyknk.cn
http://uBn7Bhkb.jyknk.cn
http://qws7GHQx.jyknk.cn
http://www.dtcms.com/wzjs/760992.html

相关文章:

  • 包装网站建设广州做网站需要多少钱
  • 自己如何建网站专业生产车间设计图纸网站
  • 广东网站设计与建设长春seo关键词排名
  • 企业网站类型东莞废水处理 东莞网站建设
  • 做网站软件miscrosoftwordpress设置移动端模版
  • 强生的网站建设原则手机网站模版 优帮云
  • 晋江网站建设价格淘宝客的网站是怎么做的
  • 做网站有必要吗搭建一个wordpress网站多钱
  • 深圳罗湖做网站58wordpress注册发邮箱验证码
  • 做网站备案都需要什么东西蚌埠公司做网站
  • 品牌网站开发背景网络营销策划方案800字
  • 贵阳做网站 优帮云网络营销怎么理解
  • 老渔哥网站建设公司网页程序开发工具
  • 宁德做网站注册了域名之后怎么做网站
  • 易语言可以做网站管理系统吗建筑工程有限公司招聘信息
  • 手机网站模板 php佛山网络建设推广
  • 网站建设 讲话百度云官方网站
  • 模板网站多少钱免费域名注册万网
  • 东莞市网站建设公司程序员培训班课程
  • 株洲做网站wordpress绿色框
  • 网站建设工单系统护语建设公司官方网站首页
  • 被墙网站查询徐州便民信息网
  • 技术成果交易网站建设方案专门做民宿的网站有哪些
  • 花钱做网站不给源代码网页界面设计中常用的中英文字体有哪些
  • 正能量软件不良网站免费入口嵌入式软件开发基础
  • 长宁区网站建设有域名怎么注册邮箱
  • 排名函数rank怎么用免费seo推广软件
  • 网站开通后5188关键词挖掘
  • 大学生创新创业网站开发做网站需要先申请域名
  • 织梦 网站名称旅游网站的后台管理系统怎么做