乙個超級簡單的伺服器框架

2021-10-03 16:26:15 字數 3300 閱讀 8769

1. 本伺服器端框架採用epoll+執行緒池+任務佇列

2. epoll和sernasock是我封裝的,threadpool用的是

epoll.h

/** * by:gzh

* 2017.12.12

* 可以改進的地方:epollin 接收資料read()處可以優化,

* 現在每次可以接收1kb的資料

*/#ifndef _gzh_epoll_h_

#define _gzh_epoll_h_

#include #include #include #include #include "net.h"

namespace gzhlib;

} #endif //_gzh_epoll_h_

epoll.cpp

#include #include #include #include #include "epoll.h"

#include "threadpool.h"

using namespace gzhlib;

gzhepoll* gzhepoll::create(socket serversocket, int maxevents, int threadcounts)

int gzhepoll::init(socket serversocket, int maxevents, int threadcounts)

void gzhepoll::run()

if(numwaitingevent == 0)

public:

//獲取埠

uint16_t getport() ;

//得到描述符

int getsock() ;

//監聽

int listen(int num) const;

//接收客戶端連線

int accept(struct sockaddr *addr, socklen_t *len) const;

//傳送資料

int send(int cli_sock, const char *szbuffer, size_t len) const;

//接收資料

int recv(int cli_sock, char *szbuffer, size_t len) const;

};}#endif //_sernasock_h_

server.cpp

/** * cservernativesock實現

*/#include #include "sernasock.h"

using namespace gzhlib;

//建構函式

cservernativesock::cservernativesock(uint16_t port):port(port)

//埠復用,繫結位址

void cservernativesock::init();

//開啟主迴圈

epoll->run();

return 0;

}接下來是執行緒池,詳情請移步

這裡只貼**,不做解釋。

threadpool.h

#ifndef thread_pool_h_

#define thread_pool_h_

#include #include #include #include #include #include #include namespace netlib;}

#endif

threadpool.cpp

#include "threadpool.h"

#include #include #include #include #include #include #include using namespace netlib;

threadpool::threadpool(int threadnumber)

:threadnumber_(threadnumber),

running_(true)

threadpool::~threadpool()}

bool threadpool::start(void)

usleep(500);

//printf("執行緒池開始執行\n");

return true; }

bool threadpool::stop(void)

}return true;}

void threadpool::threadwork(void)

if(!tasks_.empty())

else

}task(); //執行任務

}}net.h

/***********

net.h

***********/

#ifndef _net_h

#define _net_h

#include #include //epoll ways file

#include #include //block and noblock

#include #include #include #include #include #define hand_error(msg) dowhile(0)

#endif

cmakelists.txt

#1.cmake verson,指定cmake版本

cmake_minimum_required(version 3.2)

#2.project name,指定專案的名稱,一般和專案的資料夾名稱對應

#可執行檔案的名稱

project(server)

#3.標頭檔案在當前目錄,可以不用寫

include_directories( )

#4.將需要的原始檔放到乙個變數裡如:source_file

set(source_file

epoll.cpp

server.cpp

threadpool.cpp

test.cpp)

#6.add executable file,新增要編譯的可執行檔案

add_executable($ $)

#7.add link library,新增可執行檔案所需要的庫,比如我們用到了libm.so(命名規則:lib+name+.so),就新增該庫的名稱

set(shared_lib

pthread

)target_link_libraries($ $)

編譯步驟:

mkdir build

cd build

cmake ..

make

執行:./server

乙個超級簡單的伺服器框架

1.本伺服器端框架採用epoll 執行緒池 任務佇列 2.epoll和sernasock是我封裝的,threadpool用的是 epoll.h by gzh 2017.12.12 可以改進的地方 epollin 接收資料read 處可以優化,現在每次可以接收1kb的資料 ifndef gzh epo...

乙個簡單的遊戲伺服器框架

最近一段時間不是很忙,就寫了乙個自己的遊戲伺服器框架雛形,很多地方還不夠完善,但是基本上也算是能夠跑起來了。我先從上層結構說起,一直到實現細節吧,想起什麼就寫什麼。第一部分 伺服器邏輯 伺服器這邊簡單的分為三個部分,客戶端的連線首先到達閘道器伺服器,閘道器這裡有個執行緒用來監聽來自與客戶端的連線,然...

乙個簡單的遊戲伺服器框架

最近一段時間不是很忙,就寫了乙個自己的遊戲伺服器框架雛形,很多地方還不夠完善,但是基本上也算是能夠跑起來了。我先從上層結構說起,一直到實現細節吧,想起什麼就寫什麼。第一部分 伺服器邏輯 伺服器這邊簡單的分為三個部分,客戶端的連線首先到達閘道器伺服器,閘道器這裡有個執行緒用來監聽來自與客戶端的連線,然...