博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
重构网络库
阅读量:5328 次
发布时间:2019-06-14

本文共 2627 字,大约阅读时间需要 8 分钟。

之前的网络库以id作为会话对象的标示,但很多应用服务器的逻辑比较复杂,每个会话对象需要携带(保存)很多状态,那么开发人员总是会构建一个对象管理器。

所以我在之前网路库封装成以C++对象为标示,作为网络事件回调以及网络接口的参数。

这里展示的是一个pingpong协议测试程序(未分包,分包不影响此协议的效率测试)

 

 工程(需要VS2013)下载地址:

 

TcpService类就是设计的以id为对象标示的网络接口层。

而WrapServer则是封装TCPService的,以C++对象为标示的网络接口, 其C++对象为TCPSession。

 

通常使用其智能指针。

 

为了博客园规矩(其实是凑数),只有贴代码了(具体代码设计,还请各位花点时间看源代码了--我这里就不多做解释了哈,有问题还请指教)

 

Server:

#include 
#include
#include "../Net/eventloop.h"#include "../Net/WrapTCPService.h"std::mutex g_mutex;int total_recv = 0;int total_client_num = 0;void onSessionClose(TCPSession::PTR session){ g_mutex.lock(); total_client_num--; g_mutex.unlock();}int onSessionMsg(TCPSession::PTR session, const char* buffer, int len){ session->send(buffer, len); g_mutex.lock(); total_recv += len; g_mutex.unlock(); return len;}int main(int argc, char **argv){ int thread_num = atoi(argv[1]); int port_num = atoi(argv[2]); WrapServer::PTR server = std::make_shared
(); server->setDefaultEnterCallback([](TCPSession::PTR session){ session->setCloseCallback(onSessionClose); session->setDataCallback(onSessionMsg); g_mutex.lock(); total_client_num++; g_mutex.unlock(); }); server->startListen(port_num); server->startWorkThread(thread_num); EventLoop mainLoop; mainLoop.restoreThreadID(); while (true) { mainLoop.loop(1000); g_mutex.lock(); std::cout << "total recv : " << (total_recv / 1024) / 1024 << " M /s, of client num:" << total_client_num << std::endl; total_recv = 0; g_mutex.unlock(); }}

 

Client:

#include 
#include
#include "../Net/socketlibfunction.h"#include "../Net/WrapTCPService.h"void onSessionClose(TCPSession::PTR session){}int onSessionMsg(TCPSession::PTR session, const char* buffer, int len){ session->send(buffer, len); return len;}int main(int argc, char **argv){ int thread_num = atoi(argv[1]); int port_num = atoi(argv[2]); int num = atoi(argv[3]); int packet_len = atoi(argv[4]); std::string tmp(packet_len, 'a'); WrapServer::PTR server = std::make_shared
(); server->startWorkThread(thread_num); for (int i = 0; i < num; i++) { sock fd = ox_socket_connect("127.0.0.1", port_num); server->addSession(fd, [&](TCPSession::PTR session){ session->setCloseCallback(onSessionClose); session->setDataCallback(onSessionMsg); session->send(tmp.c_str(), tmp.size()); }); } std::cin.get();}

 

tks。

 

转载于:https://www.cnblogs.com/irons/p/4613637.html

你可能感兴趣的文章
Spring Bean InitializingBean和DisposableBean实例
查看>>
Solr4.8.0源码分析(5)之查询流程分析总述
查看>>
[Windows Server]安装系统显示“缺少计算机所需的介质驱动程序”解决方案
查看>>
[容斥][dp][快速幂] Jzoj P5862 孤独
查看>>
Lucene 学习之二:数值类型的索引和范围查询分析
查看>>
软件开发工作模型
查看>>
Java基础之字符串匹配大全
查看>>
面向对象
查看>>
lintcode83- Single Number II- midium
查看>>
移动端 响应式、自适应、适配 实现方法分析(和其他基础知识拓展)
查看>>
selenium-窗口切换
查看>>
selenium-滚动
查看>>
read from and write to file
查看>>
使用vue的v-model自定义 checkbox组件
查看>>
Amcharts 柱状图和线形图
查看>>
APC注入
查看>>
关于ES6 Class语法相关总结
查看>>
文件处理
查看>>
[工具] Sublime Text 使用指南
查看>>
Hangfire在ASP.NET CORE中的简单实现方法
查看>>