我刚刚偶然发现了微软的HTTP 服务器 API http://msdn.microsoft.com/en-us/library/aa364510%28v=vs.85%29.aspx。简介中写道:
HTTP 服务器 API 使应用程序能够通过 HTTP 进行通信,而无需使用 Microsoft Internet Information Server (IIS)。应用程序可以注册以接收特定 URL 的 HTTP 请求、接收 HTTP 请求并发送 HTTP 响应。 HTTP 服务器 API 包括 SSL 支持,以便应用程序可以通过安全的 HTTP 连接交换数据,而无需 IIS。它还设计用于与 I/O 完成端口配合使用。
我发现这很酷,因此仔细查看了两个版本 API 的函数列表。现在,文档中唯一提到 I/O 完成端口的其他部分是HttpReceiveHttpRequest() http://msdn.microsoft.com/en-us/library/aa364495%28v=vs.85%29.aspx功能。最后一个参数是可选的OVERLAPPED http://msdn.microsoft.com/en-us/library/ms684342%28v=vs.85%29.aspx结构描述如下:
对于异步调用,设置pOverlapped
指向一个OVERLAPPED
结构;对于同步调用,将其设置为NULL
。同步调用会阻塞,直到请求到达指定队列并检索部分或全部请求,而异步调用会立即返回ERROR_IO_PENDING
然后调用应用程序使用GetOverlappedResult()
或 I/O 完成端口来确定操作何时完成。有关使用 OVERLAPPED 结构进行同步的更多信息,请参阅同步和重叠输入和输出 http://msdn.microsoft.com/en-us/library/ms686358%28v=vs.85%29.aspx.
没有其他信息,所有结构都是不透明的,故意隐藏连接信息。另请注意,同步和重叠输入和输出主题没有提及 HTTP API。
有人知道如何将 HTTP API 的队列连接到 I/O 完成端口吗?
使用 IO 完成端口在理论上非常简单,但在实践中却很糟糕:P
“正常”用法是:
- Call 创建IO完成端口 https://learn.microsoft.com/en-us/windows/win32/fileio/createiocompletionport创建 IO 完成端口句柄。
- 创建一堆线程,并让每个线程在调用时循环获取重叠结果 https://learn.microsoft.com/en-us/windows/win32/api/ioapiset/nf-ioapiset-getoverlappedresult. 获取重叠结果当与端口关联的重叠操作完成时将返回,并带有指示哪个句柄和操作已完成的结构。
- 当您的程序运行并创建它希望异步处理的对象时,它会将每个对象关联起来
HANDLE
通过调用 IO CompletionPort 句柄创建IO完成端口 again.
现在,每次应用程序在HANDLE
(这是通过传递一个信号来表示的OVERLAPPED
结构)完成操作的通知将由正在等待的线程之一指示获取重叠结果返回。
明确的含义是HANDLE
由返回Http创建请求队列 https://learn.microsoft.com/en-us/windows/win32/api/http/nf-http-httpcreaterequestqueue可以与 IO Completion 端口关联,后续异步操作将导致获取重叠结果返回操作的结果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)