重构网络库
2015-07-01 16:42
561 查看
之前的网络库以id作为会话对象的标示,但很多应用服务器的逻辑比较复杂,每个会话对象需要携带(保存)很多状态,那么开发人员总是会构建一个对象管理器。
所以我在之前网路库封装成以C++对象为标示,作为网络事件回调以及网络接口的参数。
这里展示的是一个pingpong协议测试程序(未分包,分包不影响此协议的效率测试)
工程(需要VS2013)下载地址:http://files.cnblogs.com/files/irons/PingPangDemo.zip
TcpService类就是设计的以id为对象标示的网络接口层。
而WrapServer则是封装TCPService的,以C++对象为标示的网络接口, 其C++对象为TCPSession。
通常使用其智能指针。
为了博客园规矩(其实是凑数),只有贴代码了(具体代码设计,还请各位花点时间看源代码了--我这里就不多做解释了哈,有问题还请指教)
Server:
Client:
tks。
所以我在之前网路库封装成以C++对象为标示,作为网络事件回调以及网络接口的参数。
这里展示的是一个pingpong协议测试程序(未分包,分包不影响此协议的效率测试)
工程(需要VS2013)下载地址:http://files.cnblogs.com/files/irons/PingPangDemo.zip
TcpService类就是设计的以id为对象标示的网络接口层。
而WrapServer则是封装TCPService的,以C++对象为标示的网络接口, 其C++对象为TCPSession。
通常使用其智能指针。
为了博客园规矩(其实是凑数),只有贴代码了(具体代码设计,还请各位花点时间看源代码了--我这里就不多做解释了哈,有问题还请指教)
Server:
#include <iostream> #include <mutex> #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<WrapServer>(); 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 <iostream> #include <string> #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<WrapServer>(); 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。
相关文章推荐
- JAVA代码java.net.URLConnection发送HTTP请求的方法
- Android-监听网络状态
- TCP字节流与UDP数据报
- tcp/ip ,http,socket 区别
- HttpPost目的就是加载时第2次,第3次,第n次执行的方法 还有一个就是[httpGet] 是第一次加载的时候指定调用的
- linux网络:常用命令(二)
- 网络-数据序列化之protobuf
- iOS9 new_001:iOS9网络适配(ATS)
- android 网络编程之网络通信几种方式实例分享
- Iphone设置http代理使用Fiddle抓包
- VMWare虚拟机搭建Pentest的网络环境
- 29 GroupSock(NetAddressList)——live555源码阅读(四)网络
- UDP TCP 消息边界
- 28 GroupSock(NetAddress)——live555源码阅读(四)网络
- TCP和UDP
- 27 GroupSock概述(一)——live555源码阅读(四)网络
- windows下的socket网络编程
- HttpClient之初步认识与使用1
- Easy Basic HTTP authentication with Tornado
- CentOS 配置网络环境