Jabberd2源代码分析: MIO

本文详细分析了Jabberd2中的MIO模块,它提供了一个跨平台的API,统一了select、epoll、poll和kqueue等IO复用技术。通过`mio_t`结构体封装了各种操作,如监听、连接、注册、读写和运行。MIO根据操作系统选择合适的初始化方法,如`mio_kqueue_new`、`mio_epoll_new`等。`mio_connect`函数实现了异步连接,创建非阻塞socket并加入到MIO进行监视。当触发事件时,通过宏ACT调用用户设定的回调函数。
摘要由CSDN通过智能技术生成

MIO用于封装select epool poll kqueue使统一API。

 

可以再不同的平台选择对应的IO复用技术

 

 

typedef struct mio_st

{

  void (*mio_free)(struct mio_st **m);

 

  struct mio_fd_st *(*mio_listen)(struct mio_st **m, int port, char *sourceip,

                  mio_handler_t app, void *arg);

 

  struct mio_fd_st *(*mio_connect)(struct mio_st **m, int port, char *hostip,

                   char *srcip, mio_handler_t app, void *arg);

 

  struct mio_fd_st *(*mio_register)(struct mio_st **m, int fd,

                   mio_handler_t app, void *arg);

 

  void (*mio_app)(struct mio_st **m, struct mio_fd_st *fd,

          mio_handler_t app, void *arg);

 

  void (*mio_close)(struct mio_st **m, struct mio_fd_st *fd);

 

  void (*mio_write)(struct mio_st **m, struct mio_fd_st *fd);

 

  void (*mio_read)(struct mio_st **m, struct mio_fd_st *fd);

 

  void (*mio_run)(struct mio_st **m, int timeout);

} **mio_t;

mio_t结构体中定义了统一的API,各个IO复用技术实现这些接口

 

 

mio_t mio_new(int maxfd)

根据不同操作系统采用不同的初始化方法,有:

 

mio_t mio_kqueue_new(int maxfd);

mio_t mio_epoll_new(int maxfd);

mio_t mio_poll_new(int maxfd);

mio_t mio_select_new(int maxfd);

mio_t mio_wsasync_new(int maxfd);

 

 

这些mio_*_new函数又调用了mio_impl.h中的_mio_new函数,mio_impl.h文件中将各个IO复用技术差异部分使用宏来定义。

 

 

mio_fd_t mio_connect(mio_t m, int port, char *hostip, char *srcip, mio_handler_t app, void *arg)

mio_connect函数实现了异步的connect,在该函数中创建socket后,将socket句柄设置为非阻塞,然后调用connect函数,由于socket被设置为非阻塞,不管连接是否成功connect都会立即返回。然后将创建的socket句柄加入到mio_t中,用于监视这个句柄。传入的参数app和arg并不会立刻被调用。而是调用宏ACT时调用已设置的函调函数app。

 

#define ACT(m,f,a,d) (*(FD(m,f)->app))(m,a,&FD(m,f)->mio_fd,d,FD(m,f)->arg)

调用用户设置的回调函数,并且传入用户设置的参数


void _mio_write(mio_t m, mio_fd_t fd)

如果fd状态为type_NORMAL(如果socket已经连接成功), 调用已设置的回调函数。该回调函数是在mio_connect和mio_listen函数中设置的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值