Win socket编程I/O模型之一:select模型 + 线程池(二)
-----牛奋原创,转载注明出处,谢谢!-----
上一讲讲了select模型的基本使用方法,这一讲主要讲利用select模型 + 线程池,进而处理多于64个连接的情况。
首先需要定义两个结构体
typedef struct _SOCKET_OBJ
{
SOCKET sock; //SOCKET 套接字
_SOCKET_OBJ* pNextSocketObj; //指向下一个
}SOCKET_OBJ,*PSOCKET_OBJ;
#define MAX_SOCKETS_PER_THREAD 64
typedef struct _THREAD_OBJ
{
SOCKET sockAry[MAX_SOCKETS_PER_THREAD]; //每个线程都需要维护一个SOCKET数组
int iCurrentCount; //当前本线程中SOCKET个数
PSOCKET_OBJ pSockHead; //当前线程中SOCKET_OBJ链表首地址
PSOCKET_OBJ pSockTail; //当前线程中SOCKET_OBJ链表尾地址
CRITICAL_SECTION cs; //当前线程同步关键段
_THREAD_OBJ* pNextThreadObj; //指向下一个THREAD_OBJ
}THREAD_OBJ,*PTHREAD_OBJ;
整个程序的处理的结构参见附件图片。NND,居然无法直接贴图。
主线程负责:
1) 创建与服务器的连接,为每个连接创建对象SOCKET_OBJ,并将创建的SOCKET_OBJ交给线程处理;
2) 等待子线程退出;
子线程负责:
1) 每个子线程都不断轮询本线程内部的THREAD_OBJ的SOCKET数组中的SOCKET,调用select的那几个步骤,对这些SOCKET进行处理。
2) InsertSocketObj方法会根据当前SOCKET实际数量,决定是否需要创建新的线程。
具体代码详见附件。