1 套接字模型
1.1 select模型
利用select( ),我们可以判断套接字上是否存在数据,或者能否向一个套接字写入数据。
intselect( int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds,
conststruct timeval* timeout );
typedefstruct fd_set
{
u_int fd_count; //Number of sockets in theset
SOCKET fd_array[FD_SETSIZE]; // Array of sockets that are in the set
}fd_set;
FD_CLR(int fd, fd_set *set ) :从set中删除fd
FD_ISSET(intfd, fd_set *set) :检查fd是否是set的一名成员
FD_SET(intfd, fd_set *set) :将fd加入set
FD_ZERO(fd_set *set) :将set初始化成空
参数nfds被忽略。
参数readfds包括符合下述任何一个条件的套接字:
1.该套接字内存在数据可供读取;
2.该套接字已经被关闭、重设或中止。
3.如果已经调用过listen(),对该套接字调用accept( )会成功返回。
参数writefds包括符合下述任何一个条件的套接字:
1.该套接字内存在数据可以发出;
2.如果已经在非阻塞模式下调用过connect( ),该套接字的连接已经成功建立。
参数exceptfds包括符合下述任何一个条件的套接字:
1.该套接字内存在OOB数据可供读取;
2.如果已经在非阻塞模式下调用过connect( ),该套接字的连接没有被建立。
例如我们想测试一个套接字是否可读,必须将该套接字增添到readfds,select( )完成之后,必须判断该套接字是否仍为readfds的一部分。
参数timeout指定select( )最多等待多长时间。如果timeout是一个空指针,那么select()会无限期地阻塞下去,直到有一个套接字符合条件后结束。如果timeout指定的时间是0,表明select( )会立即返回,允许应用程序对select()进行轮询。
如果成功,就返回三个set中的所有套接字的数目;
如果超时,就返回0;
如果失败,就返回SOCKET_ERROR。
1.2 WSAAsyncSelect模型
要使用WSAAsyncSelect模型,首先必须用CreateWindow()创建一个窗口,再为该窗口提供一个窗口例程函数(Winproc)。
intWSAAsyncSelect( SOCKET s, HWND hWnd, unsigned int wMsg, long lEvent );
参数hWnd指定网络事件发生之后,收到消息的窗口。
<