Skip to content

1dao/xnet

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

76 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

redis_xnet 是一个基于 Redis 的 ae 事件驱动库适配多平台系统的网络编程框架,集成了事件循环、多线程、协程、日志等核心功能,主要用于构建高效的网络服务。以下是其详细介绍:

一、核心定位

redis_xnet 起源于 Redis 的 ae(Async Event)事件循环库,支持多平台,同时扩展了多线程、协程等功能,适合开发高性能、异步的网络服务器或客户端程序。

二、核心组件与特性

1. 事件驱动模型(基于 ae 事件循环)

事件循环是整个库的核心,负责管理 IO 事件和定时事件,类似 Redis 的事件处理机制。

  • 核心结构aeEventLoop 是事件循环的主体,维护了注册的文件事件、时间事件、多路复用器数据等。
  • 文件事件:支持注册/删除读写事件(AE_READABLE/AE_WRITABLE),通过 aeCreateFileEventaeDeleteFileEvent 管理,用于处理套接字(Socket)的 IO 操作(如服务器Accept连接、读写数据)。
  • 时间事件:支持注册定时任务(aeCreateTimeEvent),可在指定毫秒后执行回调函数,用于实现定时任务、超时检测等。
  • 多路复用适配:自动选择最优的多路复用机制(Linux 下的 epoll、BSD 下的 kqueue、Windows 下的 IOCPws2,默认 select 作为 fallback),保证跨平台兼容性。

2. 跨平台支持

  • 代码中大量使用 _WIN32 条件编译,针对 Windows 系统做了特殊处理:
    • 线程局部存储使用 _declspec(thread)(Windows)和 __thread(Linux)。
    • 时间获取适配:Windows 用 GetSystemTimeAsFileTime,Linux 用 gettimeofday
    • 网络 IO 适配:Windows 支持 IOCP(重叠 IO)和 ws2,Linux 支持 epoll 等。
  • 确保在 Windows 环境下能高效运行事件驱动的网络程序。

3. 多线程与任务调度

通过 xthread 组件提供线程池和任务管理能力:

  • 任务结构xthrTask 支持两种任务类型:
    • 普通任务(XTHR_TASK_NORMAL):执行指定函数并携带参数。
    • 恢复任务(XTHR_TASK_RESUME):用于 RPC 回调或协程恢复,关联等待 ID 和结果数据。
  • 线程间通信:通过任务队列传递 xthrTask,支持跨线程函数调用(如 demo 中的 xthread_pcall 实现 RPC 调用)。
  • 适合将耗时操作(如计算、Redis 访问)分配到工作线程,避免阻塞事件循环。

4. 协程支持(异步编程增强)

通过 xcoroutine 组件提供协程能力,简化异步代码的编写:

  • 协程任务xCoroTask 基于 C++ 20 协程标准,支持 co_await 语法,可将异步操作(如网络 IO、RPC 调用)写为同步风格代码。
  • 异常处理:内置异常捕获机制,支持处理 C++ 标准异常(如 std::runtime_error)和硬件异常(如内存访问违规、除零错误),并提供异常信息查询和处理接口(has_any_exceptionhandle_exception)。
  • 生命周期管理:通过 promise_type 管理协程状态,支持协程的创建、恢复、销毁和异常清理。

5. 基础网络服务框架

  • 服务器示例demo/xrpc_server.cpp 展示了一个简单的基于事件循环和协程的 RPC 服务器实现,监听 8888 端口,注册了三个协议处理函数以处理不同请求,并包含日志、错误处理及连接关闭回调等功能。
  • 数据序列化xpack.h 定义 XPackBuff 用于数据打包/解包,支持字节流的安全传递(线程间或网络间),避免内存拷贝问题。

6. 日志系统

  • 提供基础的日志功能(xlog.c),支持设置日志文件路径(xlog_set_file_path)、日志级别、线程名显示等,方便调试和运维。
  • 支持控制台和文件双输出,可配置时间戳、颜色显示等增强可读性。

三、典型使用场景

  • 高性能网络服务器(如 Redis 风格的缓存服务器、自定义协议服务器)。
  • 异步 IO 密集型应用(如高并发客户端、代理服务)。
  • 需要结合多线程和协程的复杂异步任务调度(如分布式任务处理)。

总结

redis_xnet 是一个以事件驱动为核心,融合了多线程、协程、跨平台适配的网络编程库,既保留了 Redis ae 库的高效事件循环特性,又扩展了 现代异步编程能力(协程、线程池),适合开发高性能、易维护的网络应用。

About

xnet

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages