上QQ阅读APP看书,第一时间看更新
2.3.1 设置Winsock的工作模式
当一个套接字通过socket()函数创建后,默认工作在阻塞模式下。为了使得套接字工作在非阻塞模式状态下,就需要对套接字进行设置,将其改编为非阻塞模式。改变套接字工作模式的方法有多种,为了基于Windows应用程序的消息驱动机制,这里只介绍常用的改变套接字的函数。该函数是WSAAsyncSelect()函数,其定义如下:
int WSAAsyncSelect( SOCKET s, HWND hWnd, unsigned int wMsg, long lEvent );
WSAAsyncSelect()函数会把套接字设置为非阻塞模式,该函数会绑定指定套接字到一个窗口。当该套接字有网络事件发生时,会向绑定窗口发送相应的消息。该函数的参数含义说明如下。
S:指定要改变工作模式为非阻塞模式的套接字。
hWnd:指定当发生网络事件时接收消息的窗口。
wMsg:指定当网络事件发生时向窗口发送的消息。该消息是一个自定义消息,定义自定义消息的方法是在WM_USER的基础上加一个数值,比如(WM_USER + 1)。
lEvent:指定应用程序感兴趣的通知码。它可以被指定为多个通知码的组合。常用的通知码有FD_READ(套接字收到对端发来的数据包)、FD_ACCEPT(监听中的套接字有连接请求)、FD_CONNECT(套接字成功连接到对方)和FD_CLOSE(套接字对应的连接被关闭)。在指定通知码时不需要全部将其指定。对于基于TCP协议的客户端来说,FD_ACCEPT是没有意义的;对于基于TCP的服务端来说,FD_CONNECT是没有意义的;对于基于UDP协议的客户端和服务器端来说,FD_ACCEPT、FD_CONNECT和FD_CLOSE都是没有意义的。