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

【Linux网络】TCP服务中IOService应用与实现

📢博客主页:https://blog.csdn.net/2301_779549673
📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson
📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
📢本文由 JohnKi 原创,首发于 CSDN🙉
📢未来很长,值得我们全力奔赴更美好的生活✨

在这里插入图片描述

在这里插入图片描述

文章目录

  • 🏳️‍🌈一、TcpService.hpp
    • 1.1 TcpService类
    • 1.2 构造、析构函数
    • 1.3 Loop() 循环函数
  • 🏳️‍🌈二、Service.hpp
    • 2.1、IOService类基本结构
    • 2.2 构造函数、析构函数
    • 2.3 IOSExcute()
  • 🏳️‍🌈三、TcpServer.cpp
  • 👥总结


上一篇文章简单的将 Socket 类进行了封装,封装的目的是为了我们后序直接使用的,因此这篇文章使用封装好的Socket类实现网络计算器(加协议版本)的一部分轮廓,此处我们将执行方法单独放在一个文件!

🏳️‍🌈一、TcpService.hpp

我们这里使用 TcpServer 的多线程版本,如有其他版本的需要,可移步 传送门

1.1 TcpService类

TcpServer类成员变量端口号,监听套接字(封装的智能指针类型),运行状态和执行方法构造函数初始化成员变量即可!

namespace TcpServerModule{using namespace SocketModule;using namespace LogModule;using service_t = std::function<void(SocketModule::SockPtr, InetAddr&)>;class TcpServer{public:TcpServer(service_t service, uint16_t port){}void Loop(){}~TcpServer(){}private:uint16_t port;SockPtr _listensock;bool _isrunning;service_t _service;};
}

1.2 构造、析构函数

构造函数初始化成员变量并创建监听套接字(调用父类方法),析构函数无需处理!

TcpServer(service_t service, uint16_t port): _port(port), _listensock(std::make_shared<TcpSocket>()),_isrunning(false), _service(service) {_listensock->BuildListenSocket(port);
}
~TcpServer() {}

1.3 Loop() 循环函数

Loop()函数使用多线程的版本执行长服务,让新线程去执行主函数传递的执行方法!

void Loop() {_isrunning = true;while (_isrunning) {InetAddr client;// 获取客户端连接SockPtr cli = _listensock->Accepter(&client);if (cli == nullptr)continue;LOG(LogLevel::DEBUG)<< "get a new connection from " << client.AddrStr().c_str();// 获取成功pthread_t tid;// ThreadData 的头文件是ThreadData* td = new ThreadData(cli, this, client);pthread_create(&tid, nullptr, Execute, td); // 新线程分离}
}
// 线程函数参数对象
class ThreadData {
public:SockPtr _sockfd;TcpServer* _self;InetAddr _addr;public:ThreadData(SockPtr sockfd, TcpServer* self, const InetAddr& addr): _sockfd(sockfd), _self(self), _addr(addr) {}
};
// 线程函数
static void* Execute(void* args) {ThreadData* td = static_cast<ThreadData*>(args);// 子线程结束后由系统自动回收资源,无需主线程调用 pthread_joinpthread_detach(pthread_self()); // 分离新线程,无需主线程回收td->_self->_service(td->_sockfd, td->_addr);delete td;return nullptr;
}

🏳️‍🌈二、Service.hpp

该文件设计一个类,其中一个成员函数实现执行方法暂时先让服务端代码编译过即可,后序再加协议!

2.1、IOService类基本结构

class IOService{public:IOService();void IOExcute(SockPtr sock, InetAddr& addr);~IOService();
};

2.2 构造函数、析构函数

这个类没有成员变量,所以这两部分不需要处理

2.3 IOSExcute()

该函数时 TcpServer 中执行方法的具体实现,此处暂时只进行IO操作,保证编译通过

void IOExcute(SockPtr sock, InetAddr& addr) {while (true) {std::string message;// ssize_t Recv(std::string* out) override{}ssize_t n = sock->Recv(&message);if (n > 0) {LOG(LogLevel::INFO) << "get message: " << message << "from"<< addr.AddrStr().c_str();std::string rsp = "response test";sock->Send(rsp);} else if (n == 0) {LOG(LogLevel::INFO)<< "client " << addr.AddrStr().c_str() << " disconnected";break;} else {LOG(LogLevel::ERROR)<< "recv error for client: " << addr.AddrStr().c_str();break;}}
}

🏳️‍🌈三、TcpServer.cpp

创建TcpServer类对象,并调用执行函数运行服务端!

#include "TcpServer.hpp"
#include "Service.hpp"using namespace TcpServerModule;int main(int argc, char* argv[]){if(argc != 2){std::cerr << "Usage: " << argv[0] << " port" << std::endl;Die(1);}uint16_t port = std::stoi(argv[1]);IOService service;std::unique_ptr<TcpServer> tsvr = std::make_unique<TcpServer>(std::bind(&IOService::IOExcute, &service, std::placeholders::_1, std::placeholders::_2),port);tsvr->Loop();return 0;
}

👥总结

本篇博文对 【Linux网络】TCP服务中IOService应用与实现 做了一个较为详细的介绍,不知道对你有没有帮助呢

觉得博主写得还不错的三连支持下吧!会继续努力的~

相关文章:

  • pnpm常见报错解决办法
  • JMeter添加HTTP请求默认值元件的作用详解
  • PicoVR眼镜在XR融合现实显示模式下无法显示粒子问题
  • 欧拉计划 Project Euler56(幂的数字和)题解
  • pnpm monoreop 打包时 node_modules 内部包 typescript 不能推导出类型报错
  • firewalld 详解
  • 制作一款打飞机游戏24:键盘输入
  • OpenAI最新的4o图像生成模型 gpt-image-1 深度解析:API KEY 获取、开发代码示例
  • 待办事项日历组件实现
  • JAVA设计模式——(七)代理模式
  • 深度探索多模态数据:从声音到图像的奇妙世界
  • C++:继承机制详解
  • 「Java EE开发指南」如何使用MyEclipse的可视化JSF编辑器设计JSP?(一)
  • 【C++基础知识】C++ 模板元编程(Template Metaprogramming, TMP)技术详解
  • 欧拉安装宝塔等,报错Errors during downloading metadata for repository ‘OS‘
  • kaggle配置
  • 基于物联网的智能家居安全防护系统设计
  • WebUI可视化:第5章:WebUI高级功能开发
  • react 常用钩子 hooks 总结
  • WordPress AI 原创文章自动生成插件 24小时全自动生成SEO原创文章 | 多语言支持 | 智能配图与排版
  • 第一集丨《无尽的尽头》值得关注,《榜上佳婿》平平无奇
  • 知名计算机专家、浙江大学教授张森逝世
  • 海南旅文局通报游客入住酒店港币被调包:成立调查组赴陵水调查
  • 网络游戏用户规模和市场销售创新高,知识产权保护面临哪些挑战?
  • 铜钴巨头洛阳钼业一季度净利润同比大增九成,最新宣布超30亿元收购黄金资产
  • 一年吸引30多万人次打卡,江苏这个渔村是怎么做到的?