将HttpApi与I/O完成端口配合使用

And*_*ron 8 windows http

我偶然发现了微软的HTTP Server API.介绍说明:

HTTP Server API使应用程序无需使用Microsoft Internet Information Server(IIS)即可通过HTTP进行通信.应用程序可以注册以接收特定URL的HTTP请求,接收HTTP请求以及发送HTTP响应.HTTP Server API包括SSL支持,以便应用程序可以在没有IIS的情况下通过安全HTTP连接交换数据.它还可以与I/O完成端口配合使用.

找到这个很酷的东西,我仔细研究了两个版本API的功能列表.现在,文档中提到I/O完成端口的唯一其他部分是HttpReceiveHttpRequest()函数.最后一个参数是一个可选OVERLAPPED结构,具有以下描述:

对于异步调用,设置pOverlapped为指向OVERLAPPED结构; 对于同步调用,将其设置为NULL.同步调用将阻塞,直到请求已到达指定队列并且已检索到其中的一些或全部,而异步调用会立即返回ERROR_IO_PENDING,然后调用应用程序使用GetOverlappedResult() 或I/O完成端口来确定操作何时完成.有关使用OVERLAPPED结构进行同步的更多信息,请参阅同步和重叠输入和输出.

没有其他信息,所有结构都是不透明的,故意隐藏连接信息.另请注意,同步和重叠输入和输出主题未提及HTTP API.

有没有人知道如何将HTTP API的队列连接到I/O完成端口?

Chr*_*cke 4

使用 IO 完成端口在理论上非常简单,但在实践中却很糟糕:P

“正常”用法是:

  1. 调用CreateIOCompletionPort创建IO完成端口句柄。
  2. 创建一堆线程,并通过调用GetOverlappedResult让每个线程循环。当与端口关联的重叠操作完成时,GetOverlappedResult将返回,并带有指示哪个句柄和操作已完成的结构。
  3. 当您的程序运行并创建它希望异步处理的对象时,它会通过再次调用CreateIOCompletionPortHANDLE将每个对象与 IO CompletionPort 句柄关联起来。

现在,每次应用程序在HANDLE(通过传入结构发出信号)发出异步操作时,等待GetOverlappedResultOVERLAPPED返回的线程之一都会指示已完成操作的通知。

明确的含义是HttpCreateRequestQueueHANDLE返回的结果可以与 IO Completion 端口关联,后续异步操作将导致GetOverlappedResult返回操作结果。