程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 重構網絡庫,重構

重構網絡庫,重構

編輯:C++入門知識

重構網絡庫,重構


之前的網絡庫以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。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved