一个跨平台的无锁且支持定时器的C++11网络库。
- 支持Window、Linux、MacOS、FreeBSD
- 同时支持同步、异步两种使用方式
- 易于扩展,支持网络粘包
- 代码少,无第三方库依赖
- 无锁设计,每个连接的创建销毁逻辑都在同一个固定的线程中处理
- 支持定时器,如心跳发送与检测
- CMake 3.15 及以上
- Clang 3.8及以上(如果你使用Clang编译)
- Visual Studio 2015及以上(Windows)
- G++ 5及以上(Linux)
- Xcode 9.4 及以上(MacOS)
vcpkg install knet
# 克隆源代码
git clone https://github.com/KibaAmor/knet.git # 或者 https://gitee.com/kibaamor/knet.git
# 进入项目目录
cd knet
# 生产编译工程文件
cmake . -B build
# 编译Release
cmake --build build --config Release
# 运行测试
(cd build && ctest --output-on-failure)
# 安装
(cd build && sudo make install)
knet的核心概念是:socket的生产-消费
。
本质来说:客户端连接服务器和服务器接受客户端的连接都是创建可以读写socket。而创建socket后,客户端和服务器对socket的操作都是一样的发送消息和接受消息。那么这个过程就可以看作是一个生成socket和消费socket的过程。如下图:
producer consumer
┌───────────┐ ┌──────────────┐
│ connector │ ——————————> │ worker │
│ │ socket │ │
│ acceptor │ ——————————> │ async_worker │
└───────────┘ └──────────────┘
- connector 连接器,在客户端连接服务器时使用
- acceptor 接收器,在服务器想要接受客户端连接时使用
- worker socket的同步处理逻辑
- async_worker socket的异步处理逻辑
example目录下提供了使用knet实现的echo服务器和echo客户端.
┌───────────────┬──────┐
│ 数据大小(4字节) │ 数据 │
└───-───────────┴──────┘
网络包前4个字节为后面数据的大小,紧跟在后面的为数据。
echo服务器将接收到的数据原封不动的发回给客户端。
同时还设置了定时器检查是否在指定的时间内收到了客户端的消息,如果未在指定时间收到客户端消息,将关闭与客户端的连接。
服务器提供了两种:
- 同步方式的echo服务端examples/server/sync_server.cpp
- 异步方式的echo服务端examples/server/async_server.cpp
客户端启动后主动连接服务器(如果连接不上服务器,则会自动重连服务器),连接成功后,会主动给服务器发送不完整的
网络包。
在收到服务器返回的网络包时,会对数据封包进行校验,失败时会断开连接。
客户端也提供了两种:
- 同步方式的echo客户端examples/client/sync_client.cpp
- 异步方式的echo客户端examples/client/async_client.cpp