您的位置:首页 > 理论基础 > 计算机网络

重构网络库

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:

#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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: