一直想整理一下關於網絡編程模型方面的文章,下面就是本博文了。
socket是每個看這篇博文的人都很熟悉的,一般在使用socket選取一些IO策略的時候,可以考慮select /poll/epoll之類的,本博文不對這個IO策略如何選擇進行討論,只是用宏選擇如何對策略進行配置。在下現以epoll作為使用的IO策略[ 參照 “epoll的使用” http://www.linuxidc.com/Linux/2012-09/71142.htm ]
一,文件結構
該模型包含幾個文件,說明和功能定義如下:
mio.c 和 mio.h :這兩個文件負責對mio_st結構的定義,並聲明創建新的mio_st結構的方法。
mio_impl.h :模型的主要實現文件 ,觸發多個操作都是從該文件觸發的。
mio_select.h和mio_select.c :用於實現SELECT IO策略文件,包含一些和SELECT策略相關的宏。
mio_poll.h和mio_poll.c:同上。用於實現POLL IO策略的文件 。
mio_epoll.h mio_epoll.c:同上。用於實現EPOLL IO策略的文件 。
二,抽象IO管理結構
mio_st 結構用於對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,
- 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_fd_st用於封裝連接文件的描述符,如下所示:
- typedef struct mio_fd_st
- {
- int fd;
- } *mio_fd_t;
另外封裝主要的行為動作和處理回調函數指針,如下:
- typedef enum { action_ACCEPT, action_READ, action_WRITE, action_CLOSE } mio_action_t;
- typedef int (*mio_handler_t) (struct mio_st **m, mio_action_t a, struct mio_fd_st *fd, void* data, void *arg);
上面表示接受客戶端連接,讀取數據,寫數據,關閉連接等操作的枚舉類型,另一個是定義用於處理這些枚舉類型所代表的動作發生時的處理函數。