90 likes | 214 Views
网络游戏 服务端编程. 套接字 I/O 模型. Blocking Select WSAAsyncSelect WSAEventSelect Overlapped CompletionPort. 利用 select 函数实现对 I/O 的管理 i nt select( int nfds , // 忽略,保持兼容 fd_set FAR* readfds , // 用于检查可读性 fd_set FAR* writefds , // 用于检查可写性 fd_set FAR* exceptfds , // 用于带外数据
E N D
网络游戏服务端编程 套接字I/O模型
Blocking • Select • WSAAsyncSelect • WSAEventSelect • Overlapped • CompletionPort
利用select函数实现对I/O的管理 • int select( intnfds, //忽略,保持兼容 fd_set FAR* readfds, //用于检查可读性 fd_set FAR* writefds, //用于检查可写性 fd_set FAR* exceptfds, //用于带外数据 conststructtimeval FAR* timeout // ) fd_set代表一系列特定套接字的集合 Select
Readfds • 有数据可以读入 • 连接已经关闭,重启或终止 • 假如已调用listen而且有一个连接处于搁置状态,那么Accept函数调用会成功 Select
Writefds • 有数据可以发出 • 如果正在对一个非阻塞连接调用进行处理,则连接就成功了 Select
Exceptfds • 假如正在对一个非阻塞连接调用进行处理,连接尝试就会失败 • 有OOB(out-of-band,带外)数据可供读取 Select
Structtimeval{ long tv_sec; //以秒为单位指定等待时间 long tv_usec; //以毫秒为单位指定等待时间 }; Select
对Fd_set进行处理与检查的宏 • FD_ZERO(* set) //将set初始化成空集合 • FD_CLR(s, * set) //从set中删除套接字s • FD_ISSET(s, * set) //检查s是否为set集合的一名成员 • FD_SET(s, *set) //将套接字s加入集合set中 Select
使用过程 • 1.使用FD_ZERO宏,初始化自己感兴趣的每一个fd_set • 2.使用FD_SET宏,将套接字句柄分配给自己感兴趣的每个fd_set • 3.调用select函数,然后等待直到I/O活动在指定的fd_set集合中设置好了一个或多个套接字句柄。Select完成后,会返回所有fd_set集合中设置的套接字句柄总数,并对每个集合进行相应的更新。 • 4.根据select的返回值,应用程序便可判断出哪些套接字存在着被搁置的I/O操作—具体的方法是使用FD_ISSET宏,对每个fd_set集合进行检查。 • 知道了每个集合中被挂起的I/O操作之后,对I/O进行处理,然后返回步骤1,继续处理select Select