摘要:WSAEventSelect模型是非阻塞的,该模型允许在一个或者多个套接字上接收以事件为基础的网络事件通知。Windows Sockets应用程序在创建套接字后,调用WSAEventSelect()函数,将一个事件对象与网络事件集合关联在一起。当网络事件发生时,应用程序以事件的形式接收网络事件通知。使用这个模型的基本思路是为感兴趣的一组网络事件创建一个事件对象,再调用WSAEventSelect()函数将网络事件和事件对象关联起来。当网络事件发生时,Winsock使相应的事件对象受信,在事件对象上的等待函数就会返回。WSAEventSelect模型简单易用,也不需要窗口环境。该模型唯一的缺点是有最多等待64个事件对象的限制,当套接字连接数量增加时,就必须创建多个线程来处理I/O,也就是所谓的线程池。
目录:
-------------------------------
- 创建TCP链接
- WSACreateEvent函数
- WSAWaitForMultipleEvents函数
- WSAEnumNetworkEvents函数
- 实践1:WASEventSelect模型
- 实践2:TCP Client
1.创建TCP链接
这里不再赘述了,能来到本文的,相信基本功已经不用多讲了。实在不明白的可以阅读《Windows Sockets网络编程(0)TCP In Action》一文,该文详细的叙述了TCP创建的整个过程。
SOCKET socket_listener = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(8086);
sin.sin_addr.S_un.S_addr = INADDR_ANY;
if (bind(socket_listener, (sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR){
closesocket(socket_listener);
return;
}
listen(socket_listener, SOMAXCONN);//SOMAXCONN = 5
2.WSACreateEvent函数
在调用WSAEventSelect函数之间,必须要先创建事件,否则没法监听。Windows事件对象有两个状态“已触发”和“未触发”,而事件对象的工作模式也有两种“人工重设”以及“自动重设”。WSACreateEvent创建的事件——原始状态是“未触发态”,当事件到来时系统会将其置为已触发态,工作模式是“人工重设”。
WSAEVENT eventArray[WSA_MAXIMUM_WAIT_EVENTS];//WSA_MAXIMUM_WAIT_EVENTS = 64
SOCKET sockArray[WSA_MAXIMUM_WAIT_EVENTS];
int nEventTotal = 0;
WSAEVENT event = WSACreateEvent();
WSAEventSelect(socket_listener, event, FD_ACCEPT | FD_CLOSE);
eventArray[nEventTotal] = event;
sockArray[nEventTotal] =