找遍整个工程   只发现一处有GetQueuedCompletionStatus  在child.c的642行里
可是却没找到他投递读操作的语句(就是类似WSARecv函数之类的)  不投递一个读操作那他是怎么收发消息的呢?
他收发数据的代码在哪个文件里呢?

解决方案 »

  1.   

    apache不用完成端口的,apache用的是线程池。
    其实大师都用最实用的技术实现高级的功能。菜鸟们整天唧唧喳喳盯着IOCP的问题问个不停,殊不知那仅仅只是一颗树而已,而根本看不到整片森林。
      

  2.   

    Apache 为 IOCP 定义了 4 种状态:typedef enum {
        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 的模型是一样的。
      

  3.   

    对啊 整个连接 关闭 收发过程只找到了 accept  shutdown的代码  收发的代码米找到  到底在哪里呢?
      

  4.   

    别误人子弟了,APACHE确实使用了IOCP,只是在其开源api apr中的poll组件组件中使用select来实现跨平台的POLL的WIN32模型,只是因为IOCP在调用方面和linux的poll/epoll有些不同。
      

  5.   

    印像中apache中用iocp来acceptex的。
      

  6.   

    其他地方应该的确没有使用iocp
      

  7.   

    楼上讲的是啊  确实acceptex是iocp来的  其他都没有IOCP的影子  可是找不到收发的代码 ~
      

  8.   

    to Analyst():线程池和IOCP又没有冲突。据我所指,apache内部也是使用IOCP的,当然,线程池也是有的。
    我没有看过apache源代码,但是看过一份apache详细的工作原理图。
      

  9.   

    在apache中无法找到GetQueuedCompletionStatus可能是因为apache将这些功能封装在他所依赖的库里(比如mymmsc(热血老猫)所说的apr)。
      

  10.   

    我倒,2.X以上版本中是有的,1.X我没有研究过,GetQueuedCompletionStatus在
    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)的方式,仔细研究一下吧。
      

  11.   

    apr里面没有完成端口的部分。
    ntmpm似乎依然是线程池+进程池来处理。
      

  12.   

    今天我也看了一下apache2.2.4的源代码。怎么看都没找到用iocp发送和接受的影子,除了用于accept之外,似乎都是同步操作(aprlib里的)+线程池来处理。mymmsc(热血老猫) 说的PostQueuexxx/GetQueuexxx的仅仅用于关闭套接字的。