WSAEventSelect 模型的实现

来源:互联网 发布:唯品会快递配送网络 编辑:程序博客网 时间:2024/04/25 15:19

                                                 WSAEventSelect  模型的实现

   WSAEventSelect 模型跟WSAAsync模型类似,他们都是由网络事件通知的,不同的是

WSAAsyncSelect是通过窗口的消息来获得通知,而WSAEventSelect是通过事件对象受信来得到通知的。

 

  1. WSAEventSelect首先把socket,事件对象,和一组由FD_READ,FD_WRITE,FD_ACCEPT,FD_CONNECT,FD_CLOSE等等组成的网络事件给绑定在一起。

 

  2.然后调用WSAWaitForMultibleEvents来等待这些网络事件的发生。如果等待完成:

  

 3.如果等待完成,那么就调用WSAEnumNetworkEvents来获得具体是什么网络事件。

 

 

  下面是服务器服务主线程的代码:

 

   因为每个WSAWaitForMultipleEvents只能够最多等待WSA_MAXMUM_WAIT_OBJECTS个事件对象,这个值被定义为64,所以最多等待64个对象。要等待更多的客户端,就需要创建更多的线程,所有这里实现了个线程池,如果一个线程

已经等待了64个,那么就新建一个线程去等待去管理这些套接字。

 

 这里实现了一个线程池,通过两个结构体:

 

 来实现线程对套接字的管理,有个全局的对象:

 //THREAD _OBJ  全局列表
THREAD_OBJ *    g_thread_list=NULL;

 用来保存所有的线程结构链表,而所有的SOCKET_OBJ结构体又被包含每个THREAD_OBJ结构体中,通过这两个list来实现线程池的。

 

线程工作函数如下:

 

 

  各相关辅助函数如下: