WSAEventSelect模型是Winsock提供的异步事件通知I/O模型。它与WSAAsyncSelect模型类似,都允许应用程序在一个或者多个套接字上接收基于事件的网络通知。但WSAEventSelect模型不需要主动建立起一个窗口类,不需要依靠Windows的消息驱动机制,而是经由事件对象的句柄进行通知。
该模型的特殊就在于它使用事件句柄来完成SOCKET事件的通知,首先在每个socket句柄上调用WSACreateEvent来创建一个WSAEvent对象句柄nt对象句柄(早期的WSAEvent与传统的Event句柄有一定的区别,但是从WinSock2.0 以后二者是同一个东西)。接着调用WSAEventSelect将SOCKET句柄和WSAEvent对象绑定,最终通过WSAWaitForMultiEvents来等待WSAEvent变为有信号,然后再来处理对应的socket。
简言之也可以说分为:创建事件对象->事件受信->查看网络事件
其中查看网络事件,使用WSAEnumNetworkEvent()函数来查看发生了什么网络事件:
Int WSAAPI
WSAEnumNetworkEvents(
In SOCKET s,
In WSAEVENT hEventObject,
Out LPWSANETWORKEVENTS lpNetworkEvents
);
本次实验中,WSAEventSelect模型本身的思路比较清晰,通过上次对于WSAAsyncSelect模型编写后,在客户端,接收信息方面的代码编写基本能顺利的写下。
在内容的编写过程中,对于如何快速计算水仙花数的判断其实可以优化,从1-1000进行水仙花数的判断,其实对于100-999三位数判断即可,在编写过程中,也遇到了算法不加而出现水仙花数中出现1000情况,这个情况的发生其实就是在过程中没有考虑清楚,算法有不恰当的地方,其实多一个对于超过三位数的判断即可,或者在一开始接收时对于超过三位数就不进行接收,或是在循环过程中进行删减,或者是在最后不向客户端反馈超过三位数的数字。