前面两讲为大家介绍了编写传统socket程序的两种方法,今天将为大家介绍一种使用Windows消息机制编写socket客户端程序的方法。使用Windows消息机制编写socket程序主要有以下的好处:一是我们可以将大部分的recv操作以及close操作放到消息处理函数里面,以利于代码的维护;二是当有数据可读的时候,本地程序会接到相应的消息,我们可以在这时候读取数据。大家可以想像一下,在传统的socket程序中,如果一个远程程序在你没有向它发送请求的时候给你传送数据的话,如果本地程序没有进行相应的检测(一种方法是通过计时器进行检测),是不能及时根据它发送给你的数据进行相应的操作的。而如果使用消息机制的话,就能很好的解决这个问题;三是可以轻松的检测出远程程序主动关闭和意外退出的情况。如果使用传统方式的话,我们必须定时进行相应的检测才能知道该情况的发生。
为了使用消息机制驱动的网络程序,我们必须使用WSAAsyncSelect函数注册Windows消息以及我们感兴趣的网络事件。WSAAsyncSelect函数的函数原型如下所示:
int WSAAsyncSelect(SOCKET s, HWND hWnd, unsigned int wMsg, long lEvent)
-
s
- [in] 需要获取相应网络事件的套接字。 hWnd [in] 需要获取相应网络事件的窗口。 wMsg [in] 当网络事件发生时候将会收到的消息。 lEvent [in] 可以使用位域组合的网络事件。 Return Values 成功返回0,失败返回SOCKET_ERROR。在返回SOCKET_ERROR的时候,你可以使用WSAGetLastError来获取相应的错误代码。 做为一个客户端程序,我们主要对以下Winsocket中定义的网络事件感兴趣。 FD_CONNECT 当连接完成的时候希望收到我们注册的网络消息。 FD_READ 当有数据可读时希望收到我们注册的网络消息。 FD_WRITE 当可以向对方写数据时希望收到我们注册的网络消息。 FD_CLOSE 当套接字关闭的时候希望收到我们注册的网络消息。 假设我们已经在应用程序中创建了套接字s,获取了窗口句柄hwnd以及定义了WM_SOCKET消息,我们可以按照如下的方式调用WSAAsyncSelect函数,以使我们可以在有数据可读和套接字关闭的时候收到WM_SOCKET消息。 但我们需要注意的是,如果对同一个套