关于对等分布

对等分发 API 支持 Windows 7、Windows Server 2008 R2、Windows 8 和 Windows Server 2012 中的分支缓存功能,它提供一组平台 API,可在从远程办公室访问时提高集中式应用程序的网络响应能力,并有助于降低整体广域网 (WAN) 利用率,而不会干扰网络安全技术。

对等分发系统提供一组平台 API,供提供数字内容的发布者和请求它的使用者使用。 为了轻松区分这些角色,可能更容易地将发布者视为服务器角色,将使用者视为客户端角色。 除此之外,请务必记住,除了这些概念角色之外,对等分发服务是一个真正的对等系统,如任何对等分发节点发布和使用数字内容的能力所表明的那样。 Win32 导入库 (PeerDist.Lib) 向发布者和使用者公开对等分发平台 API。

由发布者提供并由使用者使用对等分发服务检索的内容的生命周期由以下操作组成:

说明
内容发布 发布是为了生成内容描述,称为 “内容信息”或简称 “内容信息 ”。 然后,此内容信息可由对等分发服务的实例用来对内容进行身份验证和重新生成。 当内容由应用程序发布到对等分发服务(从概念上讲是服务器端操作)时,该内容将与发布者标识相关联,该标识基于与线程访问令牌关联的用户的 SID。 执行此绑定是为了限制未经授权的实体对内容的访问。 但是,请务必注意,访问内容信息等效于访问内容本身,因为内容信息可用于从对等方或托管缓存获取内容。
Windows 8 中存在新版本的内容信息数据结构;但是,仍支持以前的版本。 若要与 Windows 7 客户端互操作,管理员可以将对等分发服务配置为使用以前版本的内容信息数据结构。
内容检索 要使使用者从对等分发服务检索内容,必须提供对与该内容关联的已发布内容信息的访问权限。 用于发布内容的对等分发服务可以提供关联的内容信息。 使用者获得内容信息后,可以使用其他对等分发 API 从对等分发服务请求内容。 对等分发服务将尝试从本地网络检索内容。 如果内容不可用,客户端应用程序负责从源服务器检索内容。
发布删除 对于已将内容发布到对等分发服务的应用程序,已提供 PeerDistServerUnpublish 函数以允许取消发布内容。 取消发布内容后,本地对等分发服务将不再提供与该内容关联的内容信息。

异步完成

对等分布 API 支持异步 API 模型,因此,对等分布 API 允许使用 I/O 完成端口或事件作为处理异步对等分布操作完成的信号机制。 对于任一机制,对等分布都使用 OVERLAPPED 结构。 一般情况下,对等分布具有 重叠 结构和客户端传递给异步 API 函数的任何 out 参数的所有权。 在特定的异步函数完成之前,客户端不得访问这些资源。 异步函数完成后,对等分发服务将不再需要访问这些资源,并且可以在调用应用程序认为合适时重复使用这些资源。

如果函数返回除 ERROR_IO_PENDING以外的任何错误代码,则不会有任何异步完成。 返回 除 ERROR_IO_PENDING 以外的值意味着调用已同步失败。 如果对等分布 API 返回 ERROR_IO_PENDING,则调用方必须等待异步完成。

异步完成的错误代码可以通过以下两种方式之一进行检索:

基于 I/O 完成端口的完成

用户通过向以下 API 函数提供完成端口句柄和完成密钥来调用 I/O 完成端口机制:

PeerDistRegisterForStatusChangeNotification
PeerDistServerPublishStream
PeerDistServerOpenContentInformation
PeerDistClientOpenContent

用户通过调用 CreateIoCompletionPort 创建完成端口。 此完成端口句柄可以同时用于其他异步 I/O 操作以及特定于对等分发的操作。

调用方应使用 GetQueuedCompletionStatus 函数来管理异步完成。 如果异步操作失败, GetQueuedCompletionStatus 函数将返回 FALSEGetLastError 将返回相应的错误代码。 如果错误代码不是ERROR_SUCCESS,则调用方应忽略 OVERLAPPED 结构的所有字段。 如果 GetQueuedCompletionStatus 函数返回 TRUE,则异步操作成功。

有关详细信息,请参阅 I/O 完成端口

基于事件的完成

如果调用方将有效的事件句柄设置为 OVERLAPPED 结构的 hEvent 字段,则对等分布使用该句柄来指示关联的异步 I/O 操作已完成。

线程调用方可以通过在其中一个等待函数中指定 OVERLAPPED 结构的手动重置事件对象的句柄来管理重叠的操作。 向事件发出信号后,调用方必须调用 PeerGetOverlappedResult 以传入相应的 OVERLAPPED 结构。 PeerGetOverlappedResult 将返回 FALSE ,调用方必须调用 GetLastError 才能检索错误代码。 如果错误代码不是ERROR_SUCCESS,则调用方应忽略 OVERLAPPED 结构的所有字段。 如果 PeerGetOverlappedResult 函数返回 TRUE,则异步操作成功。

如果调用方提供一个完成端口以及一个事件,该事件将用作完成机制。

Windows 7: 使用 GetOverlappedResult 函数而不是 PeerGetOverlappedResult

对等分发 API 参考