C#的一些情节!

来源:互联网 发布:python入门教程pdf 编辑:程序博客网 时间:2024/04/30 02:46

  在Windows CE中,Select模型是唯一被支持的I/O模型。Select I/O模型就是利用select函数对I/O进行管理。

  函数select的功能在于获取一个或多个套接字的状态,以及在必要的时候执行同步I/O操作进行等待。它的原型如下:

  int select(

  int nfds,

  fd_set FAR* readfds,

  fd_set FAR* writefds,

  fd_set FAR* exceptfds,

  const struct timeval FAR* timeout

  );

  参数nfds被忽略,只是为了保持与Berkeley的套接字规范相兼容。

  参数readfds指向用于检查可读性的一系列套接字。

  参数writefds指向用于检查可写性的一系列套接字。

  参数exceptfds指向用于检查错误的一系列套接字。

  参数timeout设置select函数能够最多等待的I/O操作时间。在阻塞操作时,该参数被设置为NULL,表示必须有操作发生才停止等待。

  该函数返回结构体fd_set结构体中处于准备好状态的套接字句柄的数目。如果超时,函数select返回0;否则,在发生错误的时候返回SOCKET_ERROR。函数WSAGetLastError能返回的错误码以及相应的描述如下:如表11-14

  错误码描述

  WSANOTINITIALISED必须在成功调用WSAStartup函数之后,才能调用此函数

  WSAENETDOWN网络子系统出错或者相关的服务提供者出现故障

  WSAEINPROGRESS阻塞性的Winsock函数正在被调用,或是服务提供者正在处理回调函数

  WSAENOTSOCK指定的套接字描述符不是合法的套接字

  WSAEFAULT参数argp不是合法的用户地址空间的地址

  WSAEINVAL参数不被支持或是不合法

  WSAEINTR套接字被关闭

  表11-14错误码以及对应描述

  该函数用于获取一个或多个套接字的状态。对于每个套接字来说,函数能够分别获取读、写以及发生错误的状态。待查询状态的套接字用结构体fd_set来表示。统一个fd_set结构体中的所有套接字必须和同一个服务提供者相关联。函数返回的时候,结构体fd_set的值反映了满足指定条件的套接字。而函数返回值代表了满足指定条件的套接字的数目。

  如果套接字处于监听的状态且有连接请求到达,那么fd_set中相应的位被设置为可读,而accept函数不被阻塞而直接完成。对于其他状态的套接字来说,可读性表示队列中存在数据,而接收函数,如recv和recvfrom不用被阻塞。

  如果套接字在处理非阻塞的connect函数调用,套接字只有在创建连接成功完成的时候才被设置为可写。如果套接字不是处理connect函数调用,可写行表示发送函数,如send和sendto,能够保证成功执行。

  在readfds、writefds和exceptfds这三个参数中,最多只能有两个参数被同时设置为空;而另外的非空参数中至少包含一个套接字的句柄。

  readfds集合包括符合下述任一条件的套接字:

  1) 如果listen函数已经被调用,而且一个连接正在被建立,那么accept函数将成功执行。

  2) 有供读取的数据;如果SO_OOBINLINE属性被设置,这里的数据包括带外数据。

  3) 连接被关闭、重置或是中断。

  writefds集合包括符合下述任一条件的套接字:

  1) 如果正在处理一个非阻塞的connect函数调用,那么连接会成功。

  2) 数据能够被发送。

  exceptfds集合包括符合下述任一条件的套接字:

  1) 如果正在处理一个非阻塞的connect函数调用,连接尝试会失败。

  2) 在SO_OOBINLINE属性被禁止的情形下,有带外数据可以被读取。

  Winsock动态链接库还提供了相应的fd_set结构体的函数,便于程序对fd_set的控制。主要的fd_set结构体操作函数如下:

  1) FD_CLR(s, *set):从集合set中删除套接字s。

  2) FD_ISSET(s, *set):检查套接字s是否是集合set的一员。如果是,返回非零值;否则,返回0。

  3) FD_SET(s, *set):往集合set中添加套接字s。

  4) FD_ZERO(*set):初始化集合set为空集合。

0 0
原创粉丝点击