C语言socket编程模型


一直想整理一下关于网络编程模型方面的文章,下面就是本博文了。
socket是每个看这篇博文的人都很熟悉的,一般在使用socket选取一些IO策略的时候,可以考虑select /poll/epoll之类的,本博文不对这个IO策略如何选择进行讨论,只是用宏选择如何对策略进行配置。在下现以epoll作为使用的IO策略[ 参照  “epoll的使用”   ]

一,文件结构
该模型包含几个文件,说明和功能定义如下:
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的管理,包括建立监听和连接,发送或者读取数据以及其它的一些数据回调。

  1. typedef struct mio_st  
  2. {  
  3.   void (*mio_free)(struct mio_st **m);  
  4.   
  5.   struct mio_fd_st *(*mio_listen)(struct mio_st **m, int port, char *sourceip,  
  6.                   mio_handler_t app, void *arg);  
  7.   
  8.   struct mio_fd_st *(*mio_connect)(struct mio_st **m, int port, char *hostip,  
  9.                    mio_handler_t app, void *arg);  
  10.   
  11.   struct mio_fd_st *(*mio_register)(struct mio_st **m, int fd,  
  12.                    mio_handler_t app, void *arg);  
  13.   
  14.   void (*mio_app)(struct mio_st **m, struct mio_fd_st *fd,  
  15.           mio_handler_t app, void *arg);  
  16.   
  17.   void (*mio_close)(struct mio_st **m, struct mio_fd_st *fd);  
  18.   
  19.   void (*mio_write)(struct mio_st **m, struct mio_fd_st *fd);  
  20.   
  21.   void (*mio_read)(struct mio_st **m, struct mio_fd_st *fd);  
  22.   
  23.   void (*mio_run)(struct mio_st **m, int timeout);  
  24. } **mio_t;  

上面结构中的mio_fd_st用于封装连接文件的描述符,如下所示:

  1. typedef struct mio_fd_st  
  2. {  
  3.     int fd;  
  4. } *mio_fd_t; 

另外封装主要的行为动作和处理回调函数指针,如下:

  1. typedef enum { action_ACCEPT, action_READ, action_WRITE, action_CLOSE } mio_action_t;  
  2. typedef int (*mio_handler_t) (struct mio_st **m, mio_action_t a, struct mio_fd_st *fd, void* data, void *arg); 

上面表示接受客户端连接,读取数据,写数据,关闭连接等操作的枚举类型,另一个是定义用于处理这些枚举类型所代表的动作发生时的处理函数。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 下一页

相关内容