Giter Club home page Giter Club logo

zsummerx's Introduction

Welcome to the zsummerX wiki!

introduction:

Build Status
zsummerX is an net library with cross-platform, high-performance and lightweight, it's depend by C++11 implementation.
the underlying interface meet the standards proactor, and the implementation used by EPOLL LT / IOCP / SELECT, it's can work in windows / linux / mac and support TCP, UDP, HTTP.
the frame interface is advanced and esay, you can use the frame interface to quick development, it's provide OPTIONS module, don't need to worry problem with flexibility.

zsummerX是一个跨win/mac/linux/ios/android平台的高性能轻量级网络库, 采用C++11标准实现.

interface implementation

高度灵活的底层接口

  1. 遵从proactor网络模型,与boost asio的接口形式非常接近.
    
  2. 支持TCP, UDP, 支持多线程.  
    
  3. 支持post接口,可以将任意外部线程的数据和方法通过该接口转移到zsummer的loop中执行.  
    
  4. 支持定时器.  
    
  5. 需要使用者维护缓存的生命周期管理, 需要使用者对底层有所了解.  
    

更易用但仍然拥有足够灵活性的frame接口

  1.  在底层Socket抽象之上再度封装出Session抽象, 并由SessionMansger单例来统一管理.  
    
  2.  封装掉除了socket建立,断开,消息处理外的所有实现, 然后通过OPTION接口来给需要一定灵活性的需求以简洁干净的定制切口.    
    
  3.  多线程方案因单例影响, 只能在io处理后进行多线程方案, socket io只能单线程. (游戏行业和大多数行业即使用环境都足够用了, 不够的话可以多进程方案)    
    

frame接口提供以下特性支持

  1.  支持[proto4z](https://github.com/zsummer/proto4z)的二进制协议(支持C++,lua,C#,SQL).  
    
  2.  支持http协议, 可以几行代码构建出一个web服务器或者web客户端.    
    
  3.  以上两种协议为Option中的默认定制方案,通过定制option的默认接口, 可以支持任意二进制协议.        
    
  4.  支持socket断线重连, 断线重连参数可以通过Option定制.      
    
  5.  支持socket属性修改,例如NoDelay等属性.  
    
  6.  session提供定时器消息, 注册该消息后每个session在间隔一定时间后就会收到一次消息, 方便进行例如心跳检测的实现.  
    
  7.  支持UserParam, 通过让session携带自定义数据,从而可以做到获取一些属性时的O(1)级的性能,而避免在业务层进行map做额外索引.  例如针对Session的socket建立时间的记录, 上一次心跳检测到的记录, 该session是否有进行登录认证,以及相关的记录, 这个特性可以简化上层逻辑的实现并提高性能, 而实现只是几行代码的代价.   
    
  8.  支持RC4流加密, RC4的加密开启与否, 密钥等都可以通过option进行定制,可以有效防止重放攻击和旁路监听等.     
    
  9.  tcp支持flash的policy策略认证.  
    
  10.  支持限制accept的最大连接数, 超出该上限则新accept的socket会立刻踢下去.  
    
  11. 完善的异常保护机制,在try catch种执行使用者提供的消息处理回调方法,可以做到捕获所有C++的异常从而把异常错误限制在单个消息处理流程中.
    
  12. 提供运行时的堆栈记录接口, 在抛出异常的时候可以把堆栈信息打印到日志.  
    
  13. proto4z的异常均会携带堆栈信息,方便判断错误.
    
  14. 强大的[log4z日志系统](https://github.com/zsummer/log4z), zsummerX的网络库日志单独使用一个logger,并可以独立控制该logger的日志级别,显示与否等相关控制.  
    
  15. 提供并包优化方案, 可以一次性最大可能读取和写入网络数据.在洪水测试和实际项目中,该机制的性能提升非常明显.  
    
  16. 最大发送队列控制, 可以防止因网络异常或者非法攻击造成的内存失控.  
    
  17. 可以手动控制zsummerX的网络缓冲的创建和销毁, 以提高内存使用的性能.  
    
  18. 完备的统计信息,包括底层io次数, 吞吐量, 数据包发送和接受次数, 发送队列长度, 限制free内存数量和使用率等统计信息.  
    
  19. 提供友好简洁的网络关停方案.  
    
  20. 一键编译, 不依赖其他任何需要预先编译的依赖库, down下代码直接在任意平台上可以编译出静态库以及测试文件.  
    
  21. LoopEvent支持立即返回模式和无事件等待模式, 前者可以寄生在类似U3D的update中, 方便嵌入客户端.  
    
  22. 简洁务实的实现方案, 代码量小于6000行.  
    
  23. 对C++11的shared_ptr和functional的有效使用, 接口的易用性和上层代码的稳定性接近脚本语言的水平.   
    
  24. 提供[lua胶水代码 summer.h summer.cpp](https://github.com/zsummer/zsummerX/tree/master/example/luaTest), 可以直接在lua中使用zsummerX.    
    

frame options 代码预览

        enum ProtoType
        {
            PT_TCP,
            PT_HTTP,
        };
        
        struct SessionOptions 
        {

            ProtoType       _protoType = PT_TCP;
            std::string     _rc4TcpEncryption = ""; //empty is not encryption 
            bool            _openFlashPolicy = false; //check falsh client  
            bool            _setNoDelay = true; 
            bool            _joinSmallBlock = true; //merge small block  
            unsigned int    _sessionPulseInterval = 30000;  
            unsigned int    _connectPulseInterval = 5000;  
            unsigned int    _reconnects = 0; // can reconnect count 
            bool            _reconnectClean = true;//clean unsend block . 
            unsigned int    _maxSendListCount = 600;
            OnBlockCheck _onBlockCheck;
            OnBlockDispatch _onBlockDispatch;
            OnHTTPBlockCheck _onHTTPBlockCheck;
            OnHTTPBlockDispatch _onHTTPBlockDispatch;
            OnSessionEvent _onSessionClosed;
            OnSessionEvent _onSessionLinked;
            OnSessionEvent _onSessionPulse;

            CreateBlock _createBlock ;
            FreeBlock _freeBlock;
        };
        
        struct AccepterOptions
        {
            AccepterID _aID = InvalidAccepterID;
            TcpAcceptPtr _accepter;
            std::string        _listenIP;
            unsigned short    _listenPort = 0;
            unsigned int    _maxSessions = 5000;
            std::vector<std::string> _whitelistIP;
            unsigned long long _totalAcceptCount = 0;
            unsigned long long _currentLinked = 0;
            bool _closed = false;
            SessionOptions _sessionOptions;
        };

compile conditions

on windows need VS2013 or latter version
on linux need g++ 4.7 or latter version

how to compile on linux, mac

cd zsummerX/
cmake .
make

how to compile on windows

open zsummerX.sln and compile

runing frameStressTest

server
cd zsummerX/example/bin/
./frameStressTest_d 0.0.0.0 81

client
cd zsummerX/example/bin/
./frameStressTest_d 127.0.0.1 81 1

About The Author

Author: YaweiZhang
mail: [email protected]
github: https://github.com/zsummer/zsummerX

zsummerx's People

Contributors

xiaoliuzi avatar zsummer avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

zsummerx's Issues

6

66

如果使用tcp发送自定义消息,是不是要重新绑定 _onBlockCheck 函数

因为我发现如果不绑定,调用的是 proto4z 里的函数,那个函数好像会解析头部的4个字节,如果解析出错直接就重置socket了,但是如果很简单的重写 比如这样
return std::make_pair(BCT_SUCCESS, len);
那么就是因为 do While函数 不停地调用 _onBlockDispatch
实际重写的部分应该就是 把 默认 _onBlockCheck 绑定的函数 的
zsummer::proto4z::Integer packLen = zsummer::proto4z::streamToBaseType<zsummer::proto4z::Integer>(buff);
这一句重写吧

客户端发送请求的时候遇到的问题

if (_onSendHandler)
{
LCF("TcpSocket already send." << logSection());
return false;
}
客户端发送一条消息后,后面的消息,一直进这段代码,是没有收到发送完成消息,这个状态可以移除么。
我的测试环境是win7 ,服务器和客户端都在同一台笔记本上运行。

你好!朋友。我准备使用您的静态库开发一些小项目

首先介绍下我是一个新手,大约看了不少C++教程跟书籍。(3年左右的学习过程)现在正在操练动手能力。
接触网络编程大约半年多。
我准备使用iocp的时候发现c++11有些语法真的比较难理解!
但是这不影响我继续研究下去的心。
现在我有一个感觉比较吃力的地方 是不是包的地方 把包直接给用户呢 ?
然后用户提供工作线程用户自己解包,(更适合自定义数据结构传输解析)
dorecv()函数我看了好多次都没弄明白
using OnBlockCheck = std::function<OnBlockCheckResult(const char * /begin/, unsigned int /len/, unsigned int /bound/, unsigned int /blockLimit/)>;
甚至这种写法让我觉得很难理解 我知道这是函数C++11的函数指针形式,但是问题这么写我不知道怎么找出来哪里调用了。调用过程怎么样。

当务之急,请指导下在那个位置加入自定义结构 以及解析。
非常需要你的帮助。谢谢
mail [email protected]
qq 1507439798

openssl有没有支持的计划?

大佬,感谢你的努力。Log4z非常好用。
zsummerX正在学习中
想问下openssl有没有支持的计划,或者如果加ssl的话,大概怎么做

感谢开源分享,

可以使用这个项目作为物联网项目中的后台服务器吗? 专门作为和设备链接的服务器,类似电力系统的前置机

#build source code of zsummerX failed.

Hello, guys. I met some errors during I build the source code on my computer.
I install cmake by sudo apt-get install cmake

Environment:
OS: Ubuntu 1404 LTS
arch: amd64

The error infomation below:

Setting up cmake-data (2.8.12.2-0ubuntu3) ...
Setting up cmake (2.8.12.2-0ubuntu3) ...
xlz@ubuntu:~/test/zsummerX$ cmake . -DCMAKE_BUILD_TYPE=DEBUG
Inconsistency detected by ld.so: dl-version.c: 224: _dl_check_map_versions: Assertion `needed != ((void *)0)' failed!
xlz@ubuntu:~/test/zsummerX$

Thank you very much.

iocp

为什么每一个CProcess对象都会有一个完成端口对象

frameStressTest

1 CClient::onSend 中

    if (!_sendque.empty())
    {
        unsigned int sending_offset = _sending._offset;
        do
        {
            Packet *pack = _sendque.front();
            if (_MSG_BUF_LEN - sending_offset < pack->_offset)
            {
                break;
            }
            _sendque.pop();

            // 问题在这里 拷贝到接收缓冲区了
	// memcpy(_recving._orgdata+_recving._offset, pack->_orgdata, pack->_offset);
            memcpy(_sending._orgdata+ sending_offset, pack->_orgdata, pack->_offset);
            sending_offset += pack->_offset;
            _needSendLen += pack->_offset;


            delete pack;
            pack = nullptr;

            _process._nTotalSendPacket++;

        } while (!_sendque.empty());

        //_sockptr->doSend(_sending._orgdata + _sending._offset, _needSendLen - _sending._offset, std::bind(&CClient::onSend, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
        _sockptr->doSend(_sending._orgdata , _needSendLen-_sending._offset, std::bind(&CClient::onSend, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
    }

2 windows iocp 多线程 E5-2680v2 服务端客户端 同一台机器上面 跑下面的吞吐量还有提升空间吗? unix 下会更强吗?
2021-04-11 12:46:05.850 [17216] LOG_DEBUG Linked[7500] Closed[0] Recv[161.9763]M Send[161.9608]M RecvSpeed[51060] SendSpeed[99809] RecvPacket[178151] SendPacket[178147]. main.cpp:168
2021-04-11 12:46:06.850 [17216] LOG_DEBUG Linked[7500] Closed[0] Recv[190.3081]M Send[190.3291]M RecvSpeed[46993] SendSpeed[93277] RecvPacket[208737] SendPacket[208743]. main.cpp:168
2021-04-11 12:46:07.850 [17216] LOG_DEBUG Linked[7500] Closed[0] Recv[201.8860]M Send[201.8723]M RecvSpeed[45270] SendSpeed[90057] RecvPacket[221436] SendPacket[221427]. main.cpp:168
2021-04-11 12:46:08.851 [17216] LOG_DEBUG Linked[7500] Closed[0] Recv[204.8773]M Send[204.8837]M RecvSpeed[46411] SendSpeed[92520] RecvPacket[224717] SendPacket[224723]. main.cpp:168
2021-04-11 12:46:09.852 [17216] LOG_DEBUG Linked[7500] Closed[0] Recv[202.3947]M Send[202.4020]M RecvSpeed[50218] SendSpeed[100228] RecvPacket[221994] SendPacket[221997]. main.cpp:168
2021-04-11 12:46:10.853 [17216] LOG_DEBUG Linked[7500] Closed[0] Recv[200.6953]M Send[200.6898]M RecvSpeed[48238] SendSpeed[96213] RecvPacket[220130] SendPacket[220129]. main.cpp:168
2021-04-11 12:46:11.854 [17216] LOG_DEBUG Linked[7500] Closed[0] Recv[204.9502]M Send[204.6876]M RecvSpeed[49429] SendSpeed[98354] RecvPacket[224797] SendPacket[224707]. main.cpp:168
2021-04-11 12:46:12.854 [17216] LOG_DEBUG Linked[7500] Closed[0] Recv[199.6896]M Send[199.9568]M RecvSpeed[50171] SendSpeed[99897] RecvPacket[219027] SendPacket[219122]. main.cpp:168
2021-04-11 12:46:13.855 [17216] LOG_DEBUG Linked[7500] Closed[0] Recv[200.3889]M Send[200.3844]M RecvSpeed[49212] SendSpeed[98086] RecvPacket[219794] SendPacket[219794]. main.cpp:168
2021-04-11 12:46:14.855 [17216] LOG_DEBUG Linked[7500] Closed[0] Recv[196.7849]M Send[196.7895]M RecvSpeed[42835] SendSpeed[85485] RecvPacket[215841] SendPacket[215841]. main.cpp:168
2021-04-11 12:46:15.857 [17216] LOG_DEBUG Linked[7500] Closed[0] Recv[205.1590]M Send[205.1599]M RecvSpeed[42676] SendSpeed[85167] RecvPacket

在测试项目tcpStressTest中我如何构建一个对象用来发送自定义的消息?

左思右想 没搞清楚!因为测试项目发送消息都是在Cclient对象内部!假设我输入一个“hello” 想用发送出去!看上去基本不太可能 因为没有任何办法获取 client对象!也没法获取要发送的对象!。。。。这个问题该如何解决呢。关注这个项目很久了 !请伟哥帮忙看看!谢谢啦。 这个特别棘手!

咨询...

看了下此项目 感觉不错
想问下 是否有用到 上线项目中
我 自己也在写基于 zmq的类型项目
如果有 上线项目 我觉得 我没什么必要再造轮子了

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.