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

时间:2011-01-02 04:53:46

标签: 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结构进行同步的更多信息,请参阅Synchronization and Overlapped Input and Output

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

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

1 个答案:

答案 0 :(得分:4)

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

“正常”用法是:

  1. 调用CreateIOCompletionPort以创建IO完成端口句柄。
  2. 创建一堆线程,并在调用GetOverlappedResult时让每个线程循环。当与端口关联的重叠操作完成时,GetOverlappedResult将返回,其中结构指示哪个句柄和操作已完成。
  3. 当您的程序运行并创建它希望异步处理的对象时,它会通过再次调用CreateIOCompletionPort将每个HANDLE与IO CompletionPort句柄相关联。
  4. 现在,每次应用程序在HANDLE上发出异步操作时(通过传入OVERLAPPED结构信号),完成操作的通知将由等待GetOverlappedResult返回的其中一个线程指示。

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