通过git
下载源码,然后编译cppnet
静态库,编译请参考编译。
需要引用的头文件定义在include目录中,只需引用一个头文件即可。
#include "include/cppnet.h"
构造CppNet
实例,并调用Init
接口初始化,类似
CppNet net;
net.Init(2);
之后设置各个关心的回调通知函数,类似:
net.SetAcceptCallback(std::bind(&HttpServer::OnConnection, &server, std::placeholders::_1, std::placeholders::_2));
net.SetWriteCallback(std::bind(&HttpServer::OnMessageSend, &server, std::placeholders::_1, std::placeholders::_2));
net.SetReadCallback(std::bind(&HttpServer::OnMessage, &server, std::placeholders::_1, std::placeholders::_2,
std::placeholders::_3));
net.SetDisconnectionCallback(std::bind(&HttpServer::OnDisConnection, &server, std::placeholders::_1, std::placeholders::_2));
线程
- 在Linux和MacOS上,每个接收到的client socket都只会在一个线程中活动,所以不必考虑线程安全问题。
- Windows上,由IOCP调度所有的IO线程唤醒,每个socket的读写不固定在一个线程内,需考虑线程安全问题。
- 所有的网络IO和回调均在子线程中进行,请勿在各回调中进行耗时操作。
- 若主线程没有其他阻塞操作,请调用
Join
接口阻塞等待网络IO线程。
连接上下文
CNSocket
提供了
virtual void SetContext(void* context) = 0;
virtual void* GetContext() = 0;
连接上下文设置接口,可以在连接请求的回调中设置,在发送或读取回调中获取,在连接断开回调中析构,不用在应用层维护一个中心的数据结构。
使用过程可参考httpser。
Socket对象
建立连接的CNSocket
句柄在每次回调中传递,cppnet
内部通过智能指针维护其生命周期,不建议在应用层持有,以免影响连接关闭后的资源释放。
配置
通用的配置都定义在cppnet_config.h文件中,其中各配置项作用可参考注释。
在Linux平台上,开启EPOLLEXCLUSIVE
标识效率会提升近40%
(参考ab压测结果),如果内核版本高于4.5
建议开启此项设置。
多端口监听
当有多个端口需要监听时,可重复调用
bool ListenAndAccept(const std::string& ip, uint16_t port);
接口。在连接建立的回调通知中,通过
virtual uint16_t GetListenPort() = 0;
接口获取监听端口,以区分不同服务。
使用过程可参考multi_port。