当前位置: 首页 > news >正文

MoonNet网络库文档

MoonNet 使用手册


概述 (Overview)

MoonNet 是一个基于 C++ 的轻量级、高性能、事件驱动的网络库。它旨在简化网络应用程序的开发,支持 TCP 和 UDP 协议,并提供高效的事件循环机制,用于处理异步 I/O 操作。通过模块化设计,MoonNet 提供了灵活的接口,使开发者能够快速构建高性能的网络服务。


目录 (Table of Contents)

  1. 模块概述 (Module Overview)
  2. 类与接口 (Classes and Interfaces)
    • base_event
    • event
    • eventloop
    • loopthread
    • looptpool
    • Threadpool
    • buffer
    • bfevent
    • udpevent
    • timerevent
    • signalevent
    • acceptor
    • server
    • wrap
  3. 使用示例 (Usage Examples)
    • TCP 服务器示例 (TCP Server Example)
    • UDP 服务器示例 (UDP Server Example)
    • 定时器示例 (Timer Example)
    • 信号处理示例 (Signal Handling Example)
  4. 错误处理 (Error Handling)
  5. 常见问题 (FAQs)
  6. 结语 (Conclusion)

模块概述 (Module Overview)

MoonNet 的核心模块包括:

  • 事件循环 (eventloop):管理事件的注册、删除和分发,核心的 Reactor 模型实现。
  • 事件 (event):表示文件描述符的事件,封装了事件的回调和触发机制。
  • 缓冲区 (buffer):用于处理非阻塞 I/O 的数据缓冲区,实现数据的缓存和处理。
  • 缓冲事件 (bfevent):基于缓冲区的事件处理类,封装了读写缓冲区和回调函数。
  • UDP 事件 (udpevent):处理 UDP 协议的数据包收发。
  • 定时器事件 (timerevent):提供定时器功能,支持一次性和周期性定时器。
  • 信号事件 (signalevent):处理 UNIX 信号,将信号事件集成到事件循环中。
  • 连接器 (acceptor):监听 TCP 端口并接受新连接。
  • 服务器 (server):封装了 TCP 和 UDP 服务器功能,管理连接、事件和线程池。

类与接口 (Classes and Interfaces)

base_event

描述 (Description):

base_event 是所有事件类型的基类,定义了事件的基本接口和行为。

接口 (Interface):

namespace moon {class eventloop;class base_event {
public:virtual ~base_event(){}virtual eventloop* getloop() const = 0;virtual void close() = 0;virtual void disable_cb() = 0;
};}

函数说明 (Function Description):

  • virtual eventloop* getloop() const = 0;
    获取关联的事件循环对象。

  • virtual void close() = 0;
    关闭事件,释放相关资源。

  • virtual void disable_cb() = 0;
    禁用事件的回调函数,防止事件被再次触发。


event

描述 (Description):

event 类表示一个文件描述符上的事件,封装了事件的类型、回调函数和触发机制。

接口 (Interface):

namespace moon {class eventloop;// 事件类
class event : public base_event {
public:using Callback = std::function<void()>;event(eventloop* base, int fd, uint32_t events);~event();int getfd() const;                // 获取文件描述符uint32_t getevents() const;       // 获取监听的事件类型eventloop* getloop() const override;void setcb(const Callback& rcb, const Callback& wcb, const Callback& ecb); // 设置回调函数void setrcb(const Callback& rcb); // 设置读事件回调void setwcb(const Callback& wcb); // 设置写事件回调void setecb(const Callback& ecb); // 设置错误事件回调void setrevents(const uint32_t revents); // 设置触发的事件类型void enable_events(uint32_t op);  // 启用指定的事件类型void disable_events(uint32_t op); // 禁用指定的事件类型void update_ep();                 // 更新监听事件void handle_cb();                 // 处理事件回调bool readable();                  // 检查是否可读bool writeable();                 // 检查是否可写void enable_read();               // 启用读事件void disable_read();              // 禁用读事件void enable_write();              // 启用写事件void disable_write();             // 禁用写事件void enable_ET();                 // 启用边缘触发模式void disable_ET();                // 禁用边缘触发模式void reset_events();              // 重置事件类型void del_listen();                // 删除监听void enable_listen();             // 启用监听void disable_cb() override;       // 禁用回调函数void close() override;            // 关闭事件private:eventloop* loop_;int fd_;uint32_t events_;   // 监听的事件uint32_t revents_;  // 触发的事件Callback readcb_;   // 读事件回调Callback writecb_;  // 写事件回调Callback eventcb_;  // 错误事件回调
};}

函数说明 (Function Description):

  • event(eventloop* base, int fd, uint32_t events);
    构造函数,初始化事件对象。

  • ~event();
    析构函数,释放资源。

  • int getfd() const;
    获取事件关联的文件描述符。

  • uint32_t getevents() const;
    获取事件的监听类型。

  • eventloop* getloop() const override;
    获取关联的事件循环对象。

  • void setcb(const Callback& rcb, const Callback& wcb, const Callback& ecb);
    设置读、写和错误事件的回调函数。

  • void setrcb(const Callback& rcb);
    设置读事件回调。

  • void setwcb(const Callback& wcb);
    设置写事件回调。

  • void setecb(const Callback& ecb);
    设置错误事件回调。

  • void setrevents(const uint32_t revents);
    设置触发的事件类型。

  • void enable_events(uint32_t op);
    启用指定的事件类型。

  • void disable_events(uint32_t op);
    禁用指定的事件类型。

  • void update_ep();
    更新事件在 epoll 中的状态。

  • void handle_cb();
    处理事件,调用相应的回调函数。

  • bool readable();
    检查事件是否可读。

  • bool writeable();
    检查事件是否可写。

  • void enable_read();
    启用读事件监听。

  • void disable_read();
    禁用读事件监听。

  • void enable_write();
    启用写事件监听。

  • void disable_write();
    禁用写事件监听。

  • void enable_ET();
    启用边缘触发模式。

  • void disable_ET();
    禁用边缘触发模式。

  • void reset_events();
    重置事件类型。

  • void del_listen();
    删除事件监听。

  • void enable_listen();
    启用事件监听。

  • void disable_cb() override;
    禁用事件的回调函数。

  • void close() override;
    关闭事件。


eventloop

描述 (Description):

eventloop 类是事件循环的核心,实现了 Reactor 模型,管理所有事件的注册、删除和分发。

接口 (Interface):

namespace moon {class base_event;
class event;
class loopthread;// 事件循环类
class eventloop {
public:using Callback = std::function<void()>;eventloop(loopthread* base = nullptr, int timeout = -1);~eventloop();loopthread* getbaseloop();int getefd() const;int getevfd() const;int getload() const;// 事件控制函数void add_event(event* event);void del_event(event* event);void mod_event(event* event);void loop();          // 开始事件循环void loopbreak();     // 终止事件循环void getallev(std::list<event*>& list);void create_eventfd();     // 创建通知文件描述符void read_eventfd();void write_eventfd();void add_pending_del(base_event* ev); // 添加待删除的事件private:void updateload(int n); // 更新负载private:int epfd_;                         // epoll 文件描述符int eventfd_;                      // 事件通知文件描述符int timeout_;                      // epoll 超时时间std::atomic<int> load_;            // 负载(活跃事件数)std::atomic<bool> shutdown_;       // 是否关闭事件循环std::list<event*> evlist_;         // 事件列表std::vector<epoll_event> events_;  // epoll 事件数组std::vector<base_event*> delque_;  // 待删除事件队列loopthread* baseloop_;             // 所属的线程
};}

函数说明 (Function Description):

  • eventloop(loopthread* base = nullptr, int timeout = -1);
    构造函数,初始化事件循环对象。

  • ~eventloop();
    析构函数,释放资源。

  • loopthread* getbaseloop();
    获取所属的线程对象。

  • int getefd() const;
    获取 epoll 文件描述符。

  • int getevfd() const;
    获取事件通知文件描述符。

  • int getload() const;
    获取当前事件循环的负载(活跃事件数)。

  • void add_event(event* event);
    添加事件到 epoll 监听。

  • void del_event(event* event);
    从 epoll 中删除事件。

  • void mod_event(event* event);
    修改事件的监听类型。

  • void loop();
    开始事件循环,处理事件。

  • void loopbreak();
    终止事件循环。

  • void getallev(std::list<event*>& list);
    获取所有事件列表。

  • void create_eventfd();
    创建事件通知文件描述符。

  • void read_eventfd();
    读取事件通知文件描述符,处理终止事件循环的信号。

  • void write_eventfd();
    写入事件通知文件描述符,通知事件循环终止。

  • void add_pending_del(base_event* ev);
    添加待删除的事件到队列。


loopthread

描述 (Description):

loopthread 类封装了一个事件循环线程,用于运行 eventloop

接口 (Interface):

namespace moon {class eventloop;class loopthread {
public:loopthread(int timeout = -1);~loopthread();eventloop* getloop(); // 获取事件循环对象private:void _init_(); // 初始化事件循环private:eventloop* loop_;std::thread t_;std::mutex mx_;std::condition_variable cv_;int timeout_;
};}

函数说明 (Function Description):

  • loopthread(int timeout = -1);
    构造函数,初始化线程并创建事件循环。

  • ~loopthread();
    析构函数,终止线程并释放资源。

  • eventloop* getloop();
    获取事件循环对象。

  • void _init_();
    内部函数,初始化事件循环并开始循环。


looptpool

描述 (Description):

looptpool 类管理一组事件循环线程(loopthread),实现线程池功能,并提供静态/动态负载均衡。

接口 (Interface):

namespace moon {class eventloop;
class loopthread;class looptpool {
public:looptpool(eventloop* base, bool dispath = false); // 默认不开启动态负载均衡~looptpool();void create_pool(int timeout = -1);                  // 创建线程池void create_pool(int n, int timeout);                // 指定线程数创建线程池void create_pool_noadjust(int n, int timeout);       // 指定线程数创建线程池,不进行调度管理eventloop* ev_dispatch();    // 分发事件到线程池中的事件循环void delloop_dispatch();     // 删除从 reactor 并分发事件void addloop();              // 添加新的事件循环线程void adjust_task();          // 管理线程任务,动态调度从 reactorint getscale();              // 获取平均负载void enable_adjust();        // 启用动态负载均衡void stop();                 // 停止线程池// 禁用复制和赋值操作looptpool(const looptpool&) = delete;looptpool& operator=(const looptpool&) = delete;private:void init_pool(int timeout = -1); // 初始化线程池eventloop* getminload();          // 获取负载最小的事件循环int getmaxidx();                  // 获取负载最大的事件循环的索引private:eventloop* baseloop_;            // 主事件循环std::thread manager_;            // 管理线程std::vector<eventloop*> loadvec_;// 事件循环列表int next_;                       // 轮询索引int t_num_;                      // 线程数int timeout_;                    // 超时时间int max_tnum_;                   // 最大线程数int min_tnum_;                   // 最小线程数bool dispath_;                   // 是否启用动态调度int coolsec_;                    // 冷却时间int timesec_;                    // 调度时间间隔int scale_max_;                  // 最大负载比例int scale_min_;                  // 最小负载比例
};}

函数说明 (Function Description):

  • looptpool(eventloop* base, bool dispath = false);
    构造函数,初始化线程池,是否启用动态负载均衡。

  • ~looptpool();
    析构函数,释放资源。

  • void create_pool(int timeout = -1);
    创建线程池,使用默认线程数。

  • void create_pool(int n, int timeout);
    指定线程数创建线程池。

  • void create_pool_noadjust(int n, int timeout);
    指定线程数创建线程池,不进行动态调度。

  • eventloop* ev_dispatch();
    分发事件到线程池中的事件循环。

  • void delloop_dispatch();
    删除负载最大的事件循环并分发其事件。

  • void addloop();
    添加新的事件循环线程。

  • void adjust_task();
    管理线程任务,动态调整线程池大小。

  • int getscale();
    获取平均负载比例。

  • void enable_adjust();
    启用动态负载均衡。

  • void stop();
    停止线程池,终止所有事件循环。


Threadpool

描述 (Description):

Threadpool 类实现了一个通用的线程池,用于执行任意的任务函数。

接口 (Interface):

namespace moon {class Threadpool {
public:Threadpool(int num);~Threadpool();// 添加任务到线程池template<typename _Fn, typename... _Args>void add_task(_Fn&& fn, _Args&&... args);private:void init();          // 初始化线程池void t_shutdown();    // 销毁线程池void t_task();        // 任务线程入口函数void adjust_task();   // 管理线程入口函数private:std::thread adjust_thr;                    // 管理线程std::vector<std::thread> threads;          // 工作线程std::queue<std::function<void()>> tasks;   // 任务队列std::mutex mx;                             // 互斥锁std::condition_variable task_cv;           // 条件变量int min_thr_num;                           // 最小线程数int max_thr_num;                           // 最大线程数std::atomic<int> run_num;                  // 正在执行任务的线程数std::atomic<int> live_num;                 // 存活线程数std::atomic<int> exit_num;                 // 要销毁的线程数bool shutdown;                             // 线程池是否关闭
};}

函数说明 (Function Description):

  • Threadpool(int num);
    构造函数,初始化线程池,指定最小线程数。

  • ~Threadpool();
    析构函数,销毁线程池。

  • void add_task(_Fn&& fn, _Args&&... args);
    添加任务到线程池,任务函数和参数。

  • void init();
    初始化线程池,创建工作线程和管理线程。

  • void t_shutdown();
    销毁线程池,终止所有线程。

  • void t_task();
    工作线程的入口函数,执行任务。

  • void adjust_task();
    管理线程的入口函数,动态调整线程数。


buffer

描述 (Description):

buffer 类实现了一个可自动扩展的缓冲区,用于处理非阻塞 I/O 数据的缓存和操作。

接口 (Interface):

namespace moon {class buffer {
public:buffer();~buffer();void append(const char* data, size_t len); // 向缓冲区追加数据size_t remove(char* data, size_t len);     // 从缓冲区读取数据std::string remove(size_t len);            // 从缓冲区读取数据并返回字符串void retrieve(size_t len);                 // 仅移动读指针,标记数据已读size_t readbytes() const;                  // 获取可读数据大小size_t writebytes() const;                 // 获取可写空间大小const char* peek() const;                  // 获取当前读指针位置的数据void reset();                              // 重置缓冲区ssize_t readiov(int fd, int& errnum);      // 从文件描述符读取数据到缓冲区private:void able_wirte(size_t len);               // 确保有足够的可写空间private:std::vector<char> buffer_;uint64_t reader_;    // 读指针位置uint64_t writer_;    // 写指针位置
};}

函数说明 (Function Description):

  • buffer();
    构造函数,初始化缓冲区。

  • ~buffer();
    析构函数,释放资源。

  • void append(const char* data, size_t len);
    向缓冲区追加数据。

  • size_t remove(char* data, size_t len);
    从缓冲区读取数据到指定内存。

  • std::string remove(size_t len);
    从缓冲区读取数据并返回字符串。

  • void retrieve(size_t len);
    仅移动读指针,标记数据已读。

  • size_t readbytes() const;
    获取可读数据的字节数。

  • size_t writebytes() const;
    获取可写空间的字节数。

  • const char* peek() const;
    获取当前读指针位置的数据指针。

  • void reset();
    重置缓冲区,清空数据。

  • ssize_t readiov(int fd, int& errnum);
    从文件描述符读取数据到缓冲区。


bfevent

描述 (Description):

bfevent 类是基于缓冲区的事件处理类,封装了读写缓冲区和回调函数,处理 TCP 连接的数据收发。

接口 (Interface):

namespace moon {class eventloop;
class event;class bfevent : public base_event {
public:using RCallback = std::function<void(bfevent*)>;using Callback = std::function<void()>;bfevent(eventloop* base, int fd, uint32_t events);~bfevent();int getfd() const;eventloop* getloop() const override;buffer* getinbuff();buffer* getoutbuff();bool writeable() const;void setcb(const RCallback& rcb, const Callback& wcb, const Callback& ecb); // 设置回调函数void setrcb(const RCallback& rcb);void setwcb(const Callback& wcb);void setecb(const Callback& ecb);RCallback getrcb();Callback getwcb();Callback getecb();void update_ep();                // 更新监听事件void del_listen();               // 取消监听void enable_listen();            // 启用监听void sendout(const char* data, size_t len);   // 发送数据void sendout(const std::string& data);        // 发送数据size_t receive(char* data, size_t len);       // 接收数据到指定内存std::string receive(size_t len);              // 接收指定长度的数据std::string receive();                        // 接收所有可读数据void enable_events(uint32_t op);  // 启用指定事件void disable_events(uint32_t op); // 禁用指定事件void enable_read();               // 启用读事件void disable_read();              // 禁用读事件void enable_write();              // 启用写事件void disable_write();             // 禁用写事件void enable_ET();                 // 启用边缘触发void disable_ET();                // 禁用边缘触发void disable_cb() override;       // 禁用回调函数void close() override;            // 关闭事件private:void close_event();               // 内部函数,关闭事件void handle_read();               // 处理读事件void handle_write();              // 处理写事件void handle_event();              // 处理错误事件private:eventloop* loop_;int fd_;event* ev_;buffer inbuff_;buffer outbuff_;RCallback readcb_;Callback writecb_;Callback eventcb_;bool closed_;
};}

函数说明 (Function Description):

  • bfevent(eventloop* base, int fd, uint32_t events);
    构造函数,初始化缓冲事件对象。

  • ~bfevent();
    析构函数,关闭事件并释放资源。

  • int getfd() const;
    获取文件描述符。

  • eventloop* getloop() const override;
    获取关联的事件循环。

  • buffer* getinbuff();
    获取输入缓冲区。

  • buffer* getoutbuff();
    获取输出缓冲区。

  • bool writeable() const;
    检查是否可写。

  • void setcb(const RCallback& rcb, const Callback& wcb, const Callback& ecb);
    设置读、写、错误事件的回调函数。

  • void update_ep();
    更新监听事件。

  • void del_listen();
    取消监听。

  • void enable_listen();
    启用监听。

  • void sendout(const char* data, size_t len);
    发送数据。

  • void sendout(const std::string& data);
    发送数据。

  • size_t receive(char* data, size_t len);
    接收数据到指定内存。

  • std::string receive(size_t len);
    接收指定长度的数据。

  • std::string receive();
    接收所有可读数据。

  • void enable_events(uint32_t op);
    启用指定事件。

  • void disable_events(uint32_t op);
    禁用指定事件。

  • void enable_read();
    启用读事件。

  • void disable_read();
    禁用读事件。

  • void enable_write();
    启用写事件。

  • void disable_write();
    禁用写事件。

  • void enable_ET();
    启用边缘触发。

  • void disable_ET();
    禁用边缘触发。

  • void disable_cb() override;
    禁用回调函数。

  • void close() override;
    关闭事件。


udpevent

描述 (Description):

udpevent 类处理 UDP 协议的数据收发,支持非阻塞的 UDP 通信。

接口 (Interface):

namespace moon {class eventloop;
class event;// UDP 事件处理类
class udpevent : public base_event {
public:using Callback = std::function<void()>;using RCallback = std::function<void(const sockaddr_in&, udpevent*)>;udpevent(eventloop* base, int port);~udpevent();buffer* getinbuff();eventloop* getloop() const override;void setcb(const RCallback& rcb, const Callback& ecb);void setrcb(const RCallback& rcb);void setecb(const Callback& ecb);void init_sock(int port);void start();       // 开始监听void stop();        // 停止监听void update_ep();   // 更新监听事件size_t receive(char* data, size_t len);  // 接收数据到指定内存std::string receive(size_t len);         // 接收指定长度的数据std::string receive();                   // 接收所有可读数据void send_to(const std::string& data, const sockaddr_in& addr); // 发送数据到指定地址void enable_read();void disable_read();void enable_ET();void disable_ET();void disable_cb() override;RCallback getrcb();Callback getecb();void close() override; // 关闭事件private:void handle_receive(); // 处理接收事件private:eventloop* loop_;int fd_;event* ev_;buffer inbuff_;RCallback receive_cb_;Callback event_cb_;bool started_;
};}

函数说明 (Function Description):

  • udpevent(eventloop* base, int port);
    构造函数,初始化 UDP 事件对象。

  • ~udpevent();
    析构函数,关闭事件并释放资源。

  • buffer* getinbuff();
    获取输入缓冲区。

  • eventloop* getloop() const override;
    获取关联的事件循环。

  • void setcb(const RCallback& rcb, const Callback& ecb);
    设置接收和错误事件的回调函数。

  • void init_sock(int port);
    初始化 UDP 套接字。

  • void start();
    开始监听 UDP 数据包。

  • void stop();
    停止监听。

  • void update_ep();
    更新监听事件。

  • size_t receive(char* data, size_t len);
    从缓冲区接收数据。

  • std::string receive(size_t len);
    从缓冲区接收指定长度的数据。

  • std::string receive();
    从缓冲区接收所有可读数据。

  • void send_to(const std::string& data, const sockaddr_in& addr);
    发送数据到指定的地址。

  • void enable_read();
    启用读事件。

  • void disable_read();
    禁用读事件。

  • void enable_ET();
    启用边缘触发。

  • void disable_ET();
    禁用边缘触发。

  • void disable_cb() override;
    禁用回调函数。

  • void close() override;
    关闭事件。


timerevent

描述 (Description):

timerevent 类实现了定时器功能,支持一次性和周期性定时器,用于定期执行任务。

接口 (Interface):

namespace moon {class event;
class eventloop;class timerevent : public base_event {
public:using Callback = std::function<void()>;timerevent(eventloop* loop, int timeout_ms, bool periodic);~timerevent();int getfd() const;eventloop* getloop() const override;void setcb(const Callback& cb);void start();void stop();void close() override;void disable_cb() override;Callback getcb();private:void _init_();void handle_timeout();private:eventloop* loop_;event* ev_;int fd_;int timeout_ms_;bool periodic_;Callback cb_;
};}

函数说明 (Function Description):

  • timerevent(eventloop* loop, int timeout_ms, bool periodic);
    构造函数,初始化定时器事件。

  • ~timerevent();
    析构函数,关闭定时器并释放资源。

  • int getfd() const;
    获取定时器文件描述符。

  • eventloop* getloop() const override;
    获取关联的事件循环。

  • void setcb(const Callback& cb);
    设置定时器回调函数。

  • void start();
    启动定时器。

  • void stop();
    停止定时器。

  • void close() override;
    关闭定时器事件。

  • void disable_cb() override;
    禁用回调函数。


signalevent

描述 (Description):

signalevent 类处理 UNIX 信号,将信号事件集成到事件循环中,通过管道机制实现。

接口 (Interface):

namespace moon {class eventloop;
class event;class signalevent : public base_event {
public:using Callback = std::function<void(int)>;signalevent(eventloop* base);~signalevent();eventloop* getloop() const override;void add_signal(int signo);void add_signal(const std::vector<int>& signals);void setcb(const Callback& cb);void enable_listen();void del_listen();void disable_cb() override;void close() override;Callback getcb();private:static void handle_signal(int signo);void handle_read();private:eventloop* loop_;int pipe_fd_[2]; // 管道的读写端event* ev_;Callback cb_;static signalevent* sigev_; // 单例实例
};}

函数说明 (Function Description):

  • signalevent(eventloop* base);
    构造函数,初始化信号事件对象。

  • ~signalevent();
    析构函数,关闭事件并释放资源。

  • void add_signal(int signo);
    添加单个信号监听。

  • void add_signal(const std::vector<int>& signals);
    添加多个信号监听。

  • void setcb(const Callback& cb);
    设置信号处理回调函数。

  • void enable_listen();
    启用信号监听。

  • void del_listen();
    停止信号监听。

  • void disable_cb() override;
    禁用回调函数。

  • void close() override;
    关闭信号事件。


acceptor

描述 (Description):

acceptor 类负责监听指定端口,接受新的 TCP 连接,并将新连接交给回调函数处理。

接口 (Interface):

namespace moon {class eventloop;
class event;// 连接器类
class acceptor {
public:using Callback = std::function<void(int)>;acceptor(int port, eventloop* base);~acceptor();void listen();               // 开始监听void stop();                 // 停止监听void init_sock(int port);    // 初始化监听套接字void setcb(const Callback& accept_cb); // 设置回调函数void handle_accept();        // 处理新连接private:int lfd_;           // 监听套接字eventloop* loop_;   // 事件循环event* ev_;         // 事件对象Callback cb_;       // 回调函数bool shutdown_;     // 是否已关闭
};}

函数说明 (Function Description):

  • acceptor(int port, eventloop* base);
    构造函数,初始化连接器对象。

  • ~acceptor();
    析构函数,关闭监听并释放资源。

  • void listen();
    开始监听。

  • void stop();
    停止监听。

  • void init_sock(int port);
    初始化监听套接字。

  • void setcb(const Callback& accept_cb);
    设置新连接到来的回调函数。

  • void handle_accept();
    处理新连接事件。


server

描述 (Description):

server 类封装了 TCP 和 UDP 服务器功能,管理连接、事件和线程池。

接口 (Interface):

namespace moon {class udpevent;
class signalevent;
class timerevent;class server {
public:using SCallback = std::function<void(int)>;using UCallback = std::function<void(const sockaddr_in&, udpevent*)>;using RCallback = std::function<void(bfevent*)>;using Callback = std::function<void()>;server(int port = -1);~server();void start();                         // 启动服务器void stop();                          // 停止服务器void init_pool(int timeout = -1);     // 初始化线程池void init_pool(int tnum, int timeout);// 指定线程数初始化线程池void init_pool_noadjust(int tnum, int timeout); // 指定线程数初始化线程池,不进行动态调度void enable_tcp(int port);            // 启用 TCP 服务void enable_tcp_accept();             // 启用 TCP 连接监听void disable_tcp_accept();            // 禁用 TCP 连接监听eventloop* getloop();                 // 获取主事件循环eventloop* dispatch();                // 分发事件// 设置 TCP 连接的回调函数void set_tcpcb(const RCallback& rcb, const Callback& wcb, const Callback& ecb);// 事件操作void add_ev(event* ev);void del_ev(event* ev);void mod_ev(event* ev);void add_bev(bfevent* bev);void del_bev(bfevent* bev);void mod_bev(bfevent* bev);void add_udpev(udpevent* uev);udpevent* add_udpev(int port, const UCallback& rcb, const Callback& ecb);void del_udpev(udpevent* uev);void mod_udpev(udpevent* uev);void add_sev(signalevent* sev);signalevent* add_sev(int signo, const SCallback& cb);signalevent* add_sev(const std::vector<int>& signals, const SCallback& cb);void del_sev(signalevent* sev);void add_timeev(timerevent* tev);timerevent* add_timeev(int timeout_ms, bool periodic, const Callback& cb);void del_timeev(timerevent* tev);private:void acceptcb_(int fd); // 处理新连接void tcp_eventcb_(bfevent* bev); // 处理 TCP 错误事件void handle_close(base_event* ev); // 处理事件关闭private:std::mutex events_mutex_;eventloop base_;             // 主事件循环looptpool pool_;             // 线程池acceptor acceptor_;          // 连接器int port_;                   // 端口号bool tcp_enable_;            // 是否启用 TCPstd::list<base_event*> events_; // 事件列表// TCP 连接回调函数RCallback readcb_;Callback writecb_;Callback eventcb_;
};}

函数说明 (Function Description):

  • server(int port = -1);
    构造函数,初始化服务器对象。

  • ~server();
    析构函数,关闭服务器并释放资源。

  • void start();
    启动服务器,开始事件循环。

  • void stop();
    停止服务器,终止事件循环。

  • void init_pool(int timeout = -1);
    初始化线程池。

  • void enable_tcp(int port);
    启用 TCP 服务。

  • void enable_tcp_accept();
    启用 TCP 连接监听。

  • void disable_tcp_accept();
    禁用 TCP 连接监听。

  • eventloop* getloop();
    获取主事件循环。

  • eventloop* dispatch();
    分发事件到线程池。

  • void set_tcpcb(const RCallback& rcb, const Callback& wcb, const Callback& ecb);
    设置 TCP 连接的回调函数。

  • void add_ev(event* ev);
    添加事件。

  • void del_ev(event* ev);
    删除事件。

  • void mod_ev(event* ev);
    修改事件。

  • void add_bev(bfevent* bev);
    添加缓冲事件。

  • void del_bev(bfevent* bev);
    删除缓冲事件。

  • void mod_bev(bfevent* bev);
    修改缓冲事件。

  • void add_udpev(udpevent* uev);
    添加 UDP 事件。

  • udpevent* add_udpev(int port, const UCallback& rcb, const Callback& ecb);
    添加并初始化 UDP 事件。

  • void del_udpev(udpevent* uev);
    删除 UDP 事件。

  • void mod_udpev(udpevent* uev);
    修改 UDP 事件。

  • void add_sev(signalevent* sev);
    添加信号事件。

  • signalevent* add_sev(int signo, const SCallback& cb);
    添加并初始化信号事件。

  • void del_sev(signalevent* sev);
    删除信号事件。

  • timerevent* add_timeev(int timeout_ms, bool periodic, const Callback& cb);
    添加并初始化定时器事件。

  • void del_timeev(timerevent* tev);
    删除定时器事件。


wrap

描述 (Description):

wrap 模块封装了跨平台的套接字操作函数,为 Windows 和 Unix 系统提供统一的接口。

接口 (Interface):

#ifndef _WRAP_H_
#define _WRAP_H_#ifdef _WIN32// Windows 平台的套接字封装函数
void setreuse(SOCKET fd);
void setnonblock(SOCKET fd);
void perr_exit(const char* s);
// 其他函数定义...#else// Unix/Linux 平台的套接字封装函数
void settcpnodelay(int fd);
void setreuse(int fd);
void setnonblock(int fd);
void perr_exit(const char* s);
int Accept(int fd, struct sockaddr* sa, socklen_t* salenptr);
int Bind(int fd, const struct sockaddr* sa, socklen_t salen);
int Connect(int fd, const struct sockaddr* sa, socklen_t salen);
int Listen(int fd, int backlog);
int Socket(int family, int type, int protocol);
ssize_t Read(int fd, void* ptr, size_t nbytes);
ssize_t Write(int fd, const void* ptr, size_t nbytes);
int Close(int fd);
ssize_t Readn(int fd, void* vptr, size_t n);
ssize_t Writen(int fd, const void* vptr, size_t n);
ssize_t Readline(int fd, void* vptr, size_t maxlen);
// 其他函数定义...#endif#endif

函数说明 (Function Description):

  • void settcpnodelay(int fd);
    设置套接字为无延迟模式(TCP_NODELAY)。

  • void setreuse(int fd);
    设置套接字地址和端口可重用。

  • void setnonblock(int fd);
    设置套接字为非阻塞模式。

  • void perr_exit(const char* s);
    打印错误信息并退出程序。

  • int Accept(int fd, struct sockaddr* sa, socklen_t* salenptr);
    接受新的连接。

  • int Bind(int fd, const struct sockaddr* sa, socklen_t salen);
    绑定套接字到指定地址和端口。

  • int Connect(int fd, const struct sockaddr* sa, socklen_t salen);
    连接到指定的地址和端口。

  • int Listen(int fd, int backlog);
    开始监听套接字。

  • int Socket(int family, int type, int protocol);
    创建新的套接字。

  • ssize_t Read(int fd, void* ptr, size_t nbytes);
    从套接字读取数据。

  • ssize_t Write(int fd, const void* ptr, size_t nbytes);
    向套接字写入数据。

  • int Close(int fd);
    关闭套接字。

  • ssize_t Readn(int fd, void* vptr, size_t n);
    从套接字读取指定字节数的数据。

  • ssize_t Writen(int fd, const void* vptr, size_t n);
    向套接字写入指定字节数的数据。

  • ssize_t Readline(int fd, void* vptr, size_t maxlen);
    从套接字读取一行数据。


使用示例 (Usage Examples)

以下示例展示了如何使用 MoonNet 网络库构建 TCP 和 UDP 服务器,以及如何使用定时器和信号处理功能。

TCP 服务器示例 (TCP Server Example)

描述 (Description):

创建一个简单的 TCP 服务器,监听指定端口,接收客户端连接,并回显接收到的数据。

代码示例 (Code Example):

#include "server.h"
#include "bfevent.h"
#include <iostream>// 读事件回调函数
void on_read(moon::bfevent* bev) {std::string data = bev->receive();if (!data.empty()) {std::cout << "Received: " << data << std::endl;// 回显数据bev->sendout(data);}
}// 写事件回调函数
void on_write(){...
}// 其他事件回调函数(如错误)
void on_event() {std::cout << "An error occurred on the connection." << std::endl;
}int main() {// 创建服务器,监听端口 8080moon::server tcp_server(8080);// 设置缓冲事件的回调函数tcp_server.set_tcpcb(on_read, on_write, on_event);// 初始化线程池(可选)tcp_server.init_pool();// 启动服务器tcp_server.start();return 0;
}

说明 (Explanation):

  1. 创建服务器实例 (Create Server Instance):

    moon::server tcp_server(8080);
    

    创建一个 server 对象,监听 TCP 端口 8080

  2. 设置回调函数 (Set Callback Functions):

    tcp_server.set_tcpcb(on_read, nullptr, on_event);
    

    设置缓冲事件的读和错误事件的回调函数。

  3. 初始化线程池 (Initialize Thread Pool):

    tcp_server.init_pool();
    

    初始化线程池,以提高服务器的并发处理能力。

  4. 启动服务器 (Start Server):

    tcp_server.start();
    

    启动服务器,开始事件循环,监听和处理连接。


UDP 服务器示例 (UDP Server Example)

描述 (Description):

创建一个简单的 UDP 服务器,监听指定端口,接收数据包并回复客户端。

代码示例 (Code Example):

#include "server.h"
#include "udpevent.h"
#include <iostream>// UDP 接收回调函数
void on_udp_receive(const sockaddr_in& addr, moon::udpevent* uev) {std::string data = uev->receive();if (!data.empty()) {std::cout << "UDP Received from " << inet_ntoa(addr.sin_addr)<< ":" << ntohs(addr.sin_port) << " - " << data << std::endl;// 发送回复std::string reply = "Echo: " + data;uev->send_to(reply, addr);}
}int main() {// 创建服务器,不指定 TCP 端口moon::server udp_server(-1);// 添加 UDP 事件,监听端口 5005udp_server.add_udpev(5005, on_udp_receive, nullptr);// 启动服务器udp_server.start();return 0;
}

说明 (Explanation):

  1. 创建服务器实例 (Create Server Instance):

    moon::server udp_server(-1);
    

    创建一个 server 对象,不启用 TCP 服务。

  2. 添加 UDP 事件 (Add UDP Event):

    udp_server.add_udpev(5005, on_udp_receive, nullptr);
    

    添加一个 UDP 事件,监听端口 5005,并设置接收回调函数。

  3. 启动服务器 (Start Server):

    udp_server.start();
    

    启动服务器,开始事件循环,监听和处理 UDP 数据包。


定时器示例 (Timer Example)

描述 (Description):

使用定时器定期执行任务,如每隔一秒打印一条消息。

代码示例 (Code Example):

#include "server.h"
#include "timerevent.h"
#include <iostream>// 定时器回调函数
void on_timer() {std::cout << "Timer triggered!" << std::endl;
}int main() {// 创建服务器,不指定 TCP 端口moon::server timer_server(-1);// 添加一个周期性定时器,每 1000 毫秒触发一次timer_server.add_timeev(1000, true, on_timer);// 启动服务器timer_server.start();return 0;
}

说明 (Explanation):

  1. 创建服务器实例 (Create Server Instance):

    moon::server timer_server(-1);
    

    创建一个 server 对象,不启用 TCP 服务。

  2. 添加定时器事件 (Add Timer Event):

    timer_server.add_timeev(1000, true, on_timer);
    

    添加一个定时器事件,设置超时时间为 1000 毫秒(1 秒),true 表示周期性触发。

  3. 启动服务器 (Start Server):

    timer_server.start();
    

    启动服务器,开始事件循环,定时器开始工作。


信号处理示例 (Signal Handling Example)

描述 (Description):

使用信号事件处理类,监听并响应特定的 UNIX 信号,如 SIGINT(Ctrl+C)。

代码示例 (Code Example):

#include "server.h"
#include "signalevent.h"
#include <iostream>
#include <vector>
#include <csignal>// 信号处理回调函数
void on_signal(int signo) {std::cout << "Received signal: " << signo << std::endl;// 可以在此执行清理操作或优雅退出
}int main() {// 创建服务器,不指定 TCP 端口moon::server signal_server(-1);// 添加信号事件,监听 SIGINT 和 SIGTERMstd::vector<int> signals = {SIGINT, SIGTERM};signal_server.add_sev(signals, on_signal);// 启动服务器signal_server.start();return 0;
}

说明 (Explanation):

  1. 创建服务器实例 (Create Server Instance):

    moon::server signal_server(-1);
    

    创建一个 server 对象,不启用 TCP 服务。

  2. 添加信号事件 (Add Signal Event):

    std::vector<int> signals = {SIGINT, SIGTERM};
    signal_server.add_sev(signals, on_signal);
    

    添加一个信号事件,监听 SIGINTSIGTERM 信号,设置回调函数。

  3. 启动服务器 (Start Server):

    signal_server.start();
    

    启动服务器,开始事件循环,信号处理开始工作。


错误处理 (Error Handling)

MoonNet 使用标准的 POSIX 错误处理机制。当发生错误时,库将调用 perr_exit 函数打印错误消息并终止程序。用户可以根据需要自定义错误处理逻辑,例如修改回调函数以处理特定的错误情况。

示例 (Example):

wrap.cpp 中的 perr_exit 函数:

void perr_exit(const char *s) {perror(s);exit(1);
}

自定义错误处理 (Custom Error Handling):

如果希望在发生错误时不直接退出程序,可以修改 perr_exit 函数或在回调函数中添加错误处理逻辑。

示例 (Example):

在回调函数中处理错误而不是退出:

void on_event() {std::cerr << "An error occurred on the connection." << std::endl;// 执行清理操作或尝试恢复
}

常见问题 (FAQs)

1. 如何同时启用 TCP 和 UDP 服务?

回答 (Answer):

创建一个 server 实例,启用 TCP 服务并添加 UDP 事件。

示例 (Example):

#include "server.h"
#include "bfevent.h"
#include "udpevent.h"
#include <iostream>// TCP 读回调函数
void on_tcp_read(moon::bfevent* bev) {std::string data = bev->receive();if (!data.empty()) {std::cout << "TCP Received: " << data << std::endl;// 回显数据bev->sendout(data);}
}// UDP 接收回调函数
void on_udp_receive(const sockaddr_in& addr, moon::udpevent* uev) {std::string data = uev->receive();if (!data.empty()) {std::cout << "UDP Received from " << inet_ntoa(addr.sin_addr)<< ":" << ntohs(addr.sin_port) << " - " << data << std::endl;// 发送回复std::string reply = "Echo: " + data;uev->send_to(reply, addr);}
}int main() {// 创建服务器,监听 TCP 端口 8080moon::server network_server(8080);// 设置 TCP 读事件的回调函数network_server.set_tcpcb(on_tcp_read, nullptr, nullptr);// 添加 UDP 事件,监听端口 9090network_server.add_udpev(9090, on_udp_receive, nullptr);// 初始化线程池network_server.init_pool();// 启动服务器network_server.start();return 0;
}

2. 如何优雅地关闭服务器?

回答 (Answer):

调用 stop() 方法来中断事件循环,并确保所有资源被正确释放。

示例 (Example):

#include "server.h"
#include "signalevent.h"
#include <iostream>
#include <csignal>moon::server* global_server = nullptr;// 信号处理回调
void on_signal(int signo) {std::cout << "Received signal: " << signo << ", stopping server..." << std::endl;if (global_server) {global_server->stop();}
}int main() {// 创建服务器,监听 TCP 端口 8080moon::server network_server(8080);global_server = &network_server;// 设置 TCP 回调函数(省略)// 添加信号处理,监听 SIGINTnetwork_server.add_sev(SIGINT, on_signal);// 初始化线程池network_server.init_pool();// 启动服务器network_server.start();std::cout << "Server stopped gracefully." << std::endl;return 0;
}

3. 如何处理多线程中的数据竞争问题?

回答 (Answer):

MoonNet 内部通过线程池和事件循环的设计,尽量避免了数据竞争问题。各个事件循环运行在独立的线程中,用户在回调函数中处理数据时,应确保对共享资源的访问是线程安全的,可以使用互斥锁(std::mutex)等同步机制。

示例 (Example):

#include "server.h"
#include "bfevent.h"
#include <iostream>
#include <mutex>// 共享资源
std::mutex data_mutex;
int shared_data = 0;// TCP 读回调函数
void on_tcp_read(moon::bfevent* bev) {std::string data = bev->receive();if (!data.empty()) {std::lock_guard<std::mutex> lock(data_mutex);shared_data += data.size();std::cout << "Shared Data Size: " << shared_data << std::endl;}
}int main() {// 创建服务器,监听 TCP 端口 8080moon::server network_server(8080);// 设置缓冲事件的回调函数network_server.set_tcpcb(on_tcp_read, nullptr, nullptr);// 初始化线程池network_server.init_pool();// 启动服务器network_server.start();return 0;
}

结语 (Conclusion)

MoonNet 提供了一个高效且易用的网络编程框架,适用于构建各种类型的网络应用程序。通过其模块化设计和灵活的接口,开发者可以快速实现高性能的网络服务。希望本文档能够帮助您更好地理解和使用 MoonNet 网络库。

如有任何问题或建议,欢迎联系作者或提交问题反馈。



http://www.mrgr.cn/news/61124.html

相关文章:

  • Springboot + vue 图书管理系统
  • C++内存泄露排查
  • MongoDB实践
  • Windows安装ES单机版设置密码
  • 第五章:计算机网络
  • WebGL性能检测
  • svg 初识+了解 + 应用 + 动画
  • 【算法题】树状数组
  • <项目代码>YOLOv8 猫狗识别<目标检测>
  • 【传知代码】KAN卷积:医学图像分割新前沿
  • 豆豆吐槽的“客服”问题,我想骂腾讯十八代祖宗
  • 【信号发生器(二)】
  • 2024 WebStorm 免费版使用教程与WebStorm启动报错解决
  • 天锐绿盾加密软件与 Ping32,文件加密与管控功能的深度较量
  • 群控系统服务端开发模式-应用开发-业务架构逻辑开发BaseAPI继续开发一
  • 借助Aspose.Email,管理受密码保护的 PST 文件
  • Netty核心源码与优化
  • python去掉字符串空格
  • CISAW考试通过率怎么样?
  • 一款扫描整个网络存活的IP 工具——Advanced IP Scanner
  • 【软件测试】- 手机APP测试方法
  • 汽车电子行业数字化转型的实践与探索——以盈趣汽车电子为例
  • uniapp通过id获取div的宽度,高度,位置等(应该是 任意平台都通用 )
  • 视频转gif技巧:视频怎么做成动态表情包?5个简单方法搞定
  • 论文阅读:MultiUI 利用网页UI进行丰富文本的视觉理解
  • 确保公司数据不泄密的措施有哪些(如何保证公司数据安全)?8个重要措施你需要知道!