一、基本概念
1、Windows套接字在两种模式下执行I/O操作,阻塞和非阻塞。在阻塞模式下,在I/O操作完成前,执行操作的Winsock函数会一直等待下去,不会立即返回程序(将控制权交还给程序)。而在非阻塞模式下,Winsock函数无论如何都会立即返回。例如,程序中调用recvfrom函数后,如果这时网络上没有数据传送过来,该函数就会阻塞程序的执行,从而导致调用线程暂停运行。
2、Windows Sockets为了支持Windows消息驱动机制,使应用程序开发者能够方便地处理网络通信,它对网络事件采用了基于消息的异步存取策略。Windows Sockets的异步选择函数WSAAsyncSelect()提供了消息机制的网络事件选择,当使用它登记的网络事件发生时,Windows应用程序相应的窗口函数将收到一个消息,消息中指示了发生的网络事件,以及与事件相关的一些信息。
二、相关函数介绍
int WSAAsyncSelect(SOCKET s,HWND hWnd, unsigned int wMsg,long lEvent);
该函数为指定的套接字请求基于Windows消息的网络事件通知,并自动将该套接字设置为非阻塞模式。
1、s,标志请求网络事件通知的套接字描述符。
2、hWnd,标识一个网络事件发生时接收消息的窗口的句柄。
3、wMsg,指定网络事件发生时窗口将接收到的消息。
4、lEvent,指定应用程序感兴趣的网络事件。该参数可以是以下表中的值之一,并且可以采用位或操作来构造多个事件。
取值 | 说明 |
FD_READ | 接收有关是否可读的通知,以便读取数据 |
FD_WRITE | 接收有关是否可写的通知 |
FD_OOB | 接收是否带外数据抵达的通知 |
FD_ACCEPT | 接收与进入连接有关的通知 |
FD_CONNECT | 接收连接操作已完成的通知 |
FD_CLOSE | 接收与套接字 关闭有关的通知 |
FD_QOS | 接收套接字“服务质量”发生更改的通知 |
FD_GROUP_QOS | 接收套接字组“服务质量”发生更改的通知 |
FD_ROUTING_INTERFACE_CHANGE | 接收在指定的方向上,与路由接口发生变化有关的通知 |