zoukankan      html  css  js  c++  java
  • 开源一个网络框架

    前面有几篇文章介绍过一个基于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

     
    分类: 网络程序
  • 相关阅读:
    MVC 下载相关
    中缀、前缀和后缀表达式
    什么是堆栈?
    为什么和其他语言相比C语言是快速的语言
    什么是回溯法?
    产生n bit所有可能的序列
    讨论汉诺塔之谜
    递归和内存分配(可视化)
    关于递归
    随机数产生函数的范围转换
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2750094.html
Copyright © 2011-2022 走看看