18页
最后一个参数timeout对应的是一个指针,它指向一个 timeval结构,用于决定select等待I/O操作完成时,最多 等待多长的时间。如果timeout是一个空指针,那么 select调用会无限期处于阻塞状态,直到至少有一个描述 符与指定的条件相符后才结束。对timeval结构的定义如 下: struct timeval { long tv_sec; //以秒为单位指定等待时间 long tv_usec; //以毫秒为单位指定等待时间 };
• 概念 • 示例 • 适用点
8页
阻塞模型
• 用打电话为例,阻塞模型是不停的给对方打电话,直到电 话打通为止。
9页
• 因为在一个阻塞套接字上调用任何一个Winsock API函数,都会产生相同的后果---耗费或长或短 的时间等待,所以对于处在阻塞模式的套接字, 必须多加留意
10页
非阻塞模型
• 用打电话为例,非阻塞模型是给对方打电话,如果电话不 通,则过一会再打。
int select(
int nfds, fd_set FAR *readfds, fd_set FAR *writefds, fd_set FAR *exceptfds, const struct timeval FAR *timeout
);
16页
其中nfds参数会被忽略。这里有三个fd_set参数 :一个用于检查可读性(readfds),一个用于 检查可写性(writefds),另一个用于带外数据 (exceptfds)。从根本上说,fd_set数据类型 代表着一系列特定套接字的集合。
– 防止应用程序处于阻塞模式中时,在I/O绑定调用(如 send或recv)过程中进入阻塞状态; – 同时也防止在套接字处于非阻塞模式中时,产生 WSAWOULDBLOCK错误