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

The HTTP Server API enables applications to communicate over HTTP without using Microsoft Internet information Server (IIS). Applications can register to receive HTTP requests for particular URLs,receive HTTP requests,and send HTTP responses. The HTTP Server API includes SSL support so that applications can exchange data over secure HTTP connections without IIS. It is also designed to work with I/O completion ports.

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

For asynchronous calls,set pOverlapped to point to an OVERLAPPED structure; for synchronous calls,set it to NULL. A synchronous call blocks until a request has arrived in the specified queue and some or all of it has been retrieved,whereas an asynchronous call immediately returns ERROR_IO_PENDING and the calling application then uses GetoverlappedResult() or I/O completion ports to determine when the operation is completed. For more information about using OVERLAPPED structures for synchronization,see 07003.

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

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

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

“正常”用法是:

>调用CreateIOCompletionPort以创建IO完成端口句柄.
>创建一堆线程,并在调用GetoverlappedResult时让每个线程循环.当与端口关联的重叠操作完成时,GetoverlappedResult将返回,其中结构指示完成了哪个句柄和操作.
>当您的程序运行并创建它希望异步处理的对象时,它会通过再次调用CreateIOCompletionPort将每个HANDLE与IO CompletionPort句柄相关联.

现在,每次应用程序在HANDLE上发出异步操作时(通过传入OVERLAPPED结构信号),完成操作的通知将由等待GetoverlappedResult返回的其中一个线程指示.

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

windows – 使用带有I / O完成端口的HttpApi的更多相关文章

  1. windows – 使用带有I / O完成端口的HttpApi

    我刚刚偶然发现了微软的HTTPServerAPI.介绍说:TheHTTPServerAPIenablesapplicationstocommunicateoverHTTPwithoutusingMicrosoftInternetinformationServer(IIS).ApplicationscanregistertoreceiveHTTPrequestsforparticularURLs,r

  2. winapi – 在Windows中等待孙子进程

    是否可以等待Windows中子进程启动的所有进程?

随机推荐

  1. static – 在页面之间共享数据的最佳实践

    我想知道在UWP的页面之间发送像’selectedItem’等变量的最佳做法是什么?创建一个每个页面都知道的静态全局变量类是一个好主意吗?

  2. .net – 为Windows窗体控件提供百分比宽度/高度

    WindowsForm开发的新手,但在Web开发方面经验丰富.有没有办法为Windows窗体控件指定百分比宽度/高度,以便在用户调整窗口大小时扩展/缩小?当窗口调整大小时,可以编写代码来改变控件的宽度/高度,但我希望有更好的方法,比如在HTML/CSS中.在那儿?

  3. 使用Windows Azure查询表存储数据

    我需要使用特定帐户吗?>将应用程序部署到Azure服务后,如何查询数据?GoogleAppEngine有一个数据查看器/查询工具,Azure有类似的东西吗?>您可以看到的sqlExpressintance仅在开发结构中,并且一旦您表示没有等效,所以请小心使用它.>您可以尝试使用Linqpad查询表格.看看JamieThomson的thispost.

  4. windows – SetupDiGetClassDevs是否与文档中的设备实例ID一起使用?

    有没有更好的方法可以使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?您似乎必须指定DIGCF_ALLCLASSES标志以查找与给定设备实例ID匹配的所有类,或者指定ClassGuid并使用DIGCF_DEFAULT标志.这对我有用:带输出:

  5. Windows Live ID是OpenID提供商吗?

    不,WindowsLiveID不是OpenID提供商.他们使用专有协议.自从他们的“测试版”期结束以来,他们从未宣布计划继续它.

  6. 如果我在代码中进行了更改,是否需要重新安装Windows服务?

    我写了一个Windows服务并安装它.现在我对代码进行了一些更改并重新构建了解决方案.我还应该重新安装服务吗?不,只需停止它,替换文件,然后重新启动它.

  7. 带有双引号的字符串回显使用Windows批处理输出文件

    我正在尝试使用Windows批处理文件重写配置文件.我循环遍历文件的行并查找我想要用指定的新行替换的行.我有一个’函数’将行写入文件问题是%Text%是一个嵌入双引号的字符串.然后失败了.可能还有其他角色也会导致失败.如何才能使用配置文件中的所有文本?尝试将所有“在文本中替换为^”.^是转义字符,因此“将被视为常规字符你可以尝试以下方法:其他可能导致错误的字符是:

  8. .net – 将控制台应用程序转换为服务?

    我正在寻找不同的优势/劣势,将我们长期使用的控制台应用程序转换为Windows服务.我们为ActiveMQ使用了一个叫做java服务包装器的东西,我相信人们告诉我你可以用它包装任何东西.这并不是说你应该用它包装任何东西;我们遇到了这个问题.控制台应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的.任何推荐?我们应该在VisualStudio中将其重建为服务吗?我使用“-install”/“-uninstall”开关执行此操作.例如,seehere.

  9. windows – 捕获外部程序的STDOUT和STDERR *同时*它正在执行(Ruby)

    哦,我在Windows上:-(实际上,它比我想象的要简单,这看起来很完美:…是的,它适用于Windows!

  10. windows – 当我试图批量打印变量时,为什么我得到“Echo is on”

    我想要执行一个简单的批处理文件脚本:当我在XP中运行时,它给了我预期的输出,但是当我在Vista或Windows7中运行它时,我在尝试打印值时得到“EchoisOn”.以下是程序的输出:摆脱集合表达式中的空格.等号(=)的两侧可以并且应该没有空格BTW:我通常在@echo关闭的情况下启动所有批处理文件,并以@echo结束它们,所以我可以避免将代码与批处理文件的输出混合.它只是使您的批处理文件输出更好,更清洁.

返回
顶部