0.1 socket工厂 (创建socket,绑定完成端口CreateIoCompletionPort)
-------------------------------------------------主线程-----------------------------------------------
1.初始化
1.1 创建一个完成端口
1.2 创建线程池
2.创建绑定socket
2.1 调用0.1 (创建ListenSocket)
2.3 绑定端口
3.设置为被动或主动
3.1 listen
3.2 获得AcceptEx指针
3.3 调用0.1(创建AcceptSocket)
3.4 调用AcceptEx(根据设置确定初始投递多少个),设置第三个参数为0
4.while(1){
5.执行某种阻塞调用
5.1 调用WSAEventSelect,监听FD_ACCEPT事件(监听到时,在总AcceptEx 请求小于设置的最大值的情况下,投递一个新的AcceptEx请求),并设置一个超时(可配置的),超时的话,检查当前活动线程数,看是否要创建一个新的工作者线程(创建新的线程不会使总线程数超过设置的最大值)
如下:
WSAEventSelect();
if(超时||time_last-time()>超时值) {
检查当前活动线程数,接近总线程数时创建一个新的工作者线程
调用用户提供的回调函数,满足用户的定时需求(这个定时是一个不稳定的定时[t,2t))。
time_last=time();
}
if(FD_ACCEPT){
执行0.1,投递一个AcceptEx
}
当接收到关闭信号时,向工作者线程投递关闭信号
--------------------------------------------工作者线程-----------------------------------------------
1. 一些初始化
2.while(1){
GetQueuedCompletionStatus
当接收到AcceptEx完成包时,投递一个新的AcceptEx请求
当接收到Read完成包时,………………
}