開源一個網絡框架


前面有幾篇文章介紹過一個基於linux epoll的網絡接口,但並未將接口組合成一個方便使用的網絡框架。

下面先簡單介紹下以前發布過的網絡接口:

首先是基本接口:

KendyNet.h KendyNet.c  https://github.com/sniperHW/kendylib/blob/master/include/KendyNet.h

此接口提供了最簡單的單線程網絡收發模型,並未提供封包解包等功能,使用者可在此之上根據自己的需求封裝出合適的網絡框架

第二組接口在第一組接口上提供了封包和解包:

Connection.h Connectionc https://github.com/sniperHW/kendylib/blob/master/include/Connection.h

這個封裝提供了一種比較高效的封包方式,(封包方式的介紹可參看前面的文章)如果使用者覺得這種封包方式可以滿足需求,可在此之上

封裝合適的網絡框架.

最后,也就是本文介紹的主題,利用第二組接口封裝出來的,網絡與邏輯分離的多線程網絡框架.

此框架的核心是一個消息隊列,用於在網絡層和邏輯層之間通信,網絡層將接收到的數據包,網絡事件(連接斷開,新到連接)通過消息隊列傳送到邏輯層,

供邏輯層處理.邏輯層需要發送的數據,操作(主動關閉套接口)通過消息隊列傳送到網絡層。所有線程之間的同步操作,基本上都圍繞着消息隊列,使用者

基本不用考慮鎖問題。(關於消息隊列的設計和效率,可以參考前一篇文章)

下面貼出簡單的echo測試程序:

#include "netservice.h"
#include "msg_loop.h"
#include "datasocket.h"
#include "SysTime.h"

int32_t count = 0;

void server_process_packet(datasocket_t s,rpacket_t r)
{
    wpacket_t w = wpacket_create_by_rpacket(NULL,r);
    data_send(s,w);
}

void process_new_connection(datasocket_t s)
{
    ++count;
    printf("%d\n",count);
}

void process_connection_disconnect(datasocket_t s,int32_t reason)
{
    release_datasocket(&s);
    --count;
    printf("%d\n",count);    
}

const char *ip;
uint32_t port;
int main(int argc,char **argv)
{
    init_system_time(10);
    ip = argv[1];
    port = atoi(argv[2]);
    signal(SIGPIPE,SIG_IGN);
    init_mq_system();
    init_clients();
    if(InitNetSystem() != 0)
    {
        printf("Init error\n");
        return 0;
    }
    
    netservice_t n = create_net_service(1);//創建一個網絡服務框架,只使用一個網絡線程
    net_add_listener(n,ip,port);           //添加監聽
    //創建主消息循環對象
    msg_loop_t m = create_msg_loop(server_process_packet,process_new_connection,process_connection_disconnect);
    
    while(1)
    {
        //不斷從消息隊列中提取消息並處理
        msg_loop_once(m,n,100);    
    }

    return 0;
}

 

項目地址:https://github.com/sniperHW/kendylib/tree/master/netframework

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM