找遍整个工程 只发现一处有GetQueuedCompletionStatus 在child.c的642行里
可是却没找到他投递读操作的语句(就是类似WSARecv函数之类的) 不投递一个读操作那他是怎么收发消息的呢?
他收发数据的代码在哪个文件里呢?
可是却没找到他投递读操作的语句(就是类似WSARecv函数之类的) 不投递一个读操作那他是怎么收发消息的呢?
他收发数据的代码在哪个文件里呢?
其实大师都用最实用的技术实现高级的功能。菜鸟们整天唧唧喳喳盯着IOCP的问题问个不停,殊不知那仅仅只是一颗树而已,而根本看不到整片森林。
IOCP_CONNECTION_ACCEPTED = 1,
IOCP_WAIT_FOR_RECEIVE = 2,
IOCP_WAIT_FOR_TRANSMITFILE = 3,
IOCP_SHUTDOWN = 4
} io_state_e;Apache 现在只用到了AcceptEx 和 Shutdown 状态,可能以后会用上 Recvive 和 Transmitfile 的。
Apache 用线程池是因为 HTTP 这种短连接协议, Apache 用线程池也有其历史原因,但也在进化中,L/F 就是一种目标,这种模型与 IOCP 的模型是一样的。
我没有看过apache源代码,但是看过一份apache详细的工作原理图。
D:\MyMMSC\projects\c\httpd-2.2.4\server\mpm\winnt\child.c(702),
在apache httpd服务器端程序,对于SERVER端采用了分开处理的模式,也就是MPM模型对于不同的平台处理方式不同,其他操作系统先不讨论,winnt/prefork,分别对应win32/unix/linux,在win32中使用了iocp,而prefork则使用跨平台的apr_poll组件,不同的类unix系统可能会是不同的,如linux的poll/epoll和freebsd的kqueue。
IOCP是通过投递(Post。)一个重叠IO操作来完成收发的,不是传统的WSARecv(。&pol)的方式,仔细研究一下吧。
ntmpm似乎依然是线程池+进程池来处理。