支援 Windows 7、Windows Server 2008 R2、Windows 8 和 Windows Server 2012 的對等散發 API 提供一組平臺 API,這些 API 可在從遠端辦公室存取時提高集中式應用程式的網路響應速度,協助減少整體廣域網(WAN)的使用量,且不干擾網路安全技術。
對等分發系統提供一套平台 API,供提供和獲取數位內容的發佈者及使用者使用。 若要輕鬆區分這些角色,可以將發行者視作伺服器角色,而將取用者視作用戶端角色,會更容易。 重要的是要記住,除了這些概念角色之外,對等散發服務是一個真正的對等系統,這是由於任何對等散發節點都可以發佈和取用數位內容的能力所表明的。 對等散發平台 API 透過 Win32 匯入程式庫 (PeerDist.Lib) 提供給發行者和取用者。
發行者提供且取用者使用對等散發服務擷取的內容生命週期是由下列作業所組成:
| 描述 | |
|---|---|
| 內容發布 | 發佈是為了產生被稱為 內容資訊的內容描述,或簡稱為 內容資訊。 然後,對等散發服務的實例可以使用此內容資訊來驗證和重建內容。 當應用程式將內容發佈至「Peer Distribution 服務」時,該內容在概念上是屬於伺服器端的操作,並且會根據與線程存取權杖相關的使用者的 SID 被歸屬於發佈者身份。 此系結是為了限制未經授權的實體存取內容。 不過,請務必注意,存取內容資訊相當於存取內容本身,因為內容資訊可用來從對等或託管快取取得內容。 Windows 8 中有新版本的內容信息數據結構;不過,仍支援舊版。 若要與 Windows 7 用戶端互通,系統管理員可設定對等散發服務,以使用舊版的內容資訊數據結構。 |
| 內容擷取 | 若要讓取用者從對等發佈服務擷取內容,必須提供與該內容相關聯的已發佈內容資訊存取權。 用來發佈內容的對等發佈服務可以提供相關聯的內容資訊。 使用者擁有內容資訊之後,其他對等傳輸 API 可用來向對等傳輸服務請求內容。 對等散發服務會嘗試從局域網路擷取內容。 如果內容無法使用,用戶端應用程式會負責從來源伺服器擷取內容。 |
| 出版物移除 | 對於已將內容發佈至對等散發服務的應用程式,已提供 PeerDistServerUnpublish 函式,以允許取消發佈內容。 當內容取消發佈後,本機對等分發服務將不再提供與該內容相關的內容資訊。 |
非同步完成
對等散發 API 支援異步 API 模型,因此對等散發 API 允許使用 I/O 完成埠或事件作為處理異步對等散發作業完成的訊號機制。 針對任一機制,對等散發會使用 重疊的 結構。 一般而言,對等散發會取得 重疊 結構的擁有權,以及客戶端傳遞給異步 API 函式的任何輸出參數。 客戶端必須等到特定異步函式完成,才能存取這些資源。 一旦異步函式完成,對等散發服務就不再需要存取這些資源,而且當呼叫的應用程式認為適當時,可能會重複使用它們。
如果函式傳回 ERROR_IO_PENDING以外的任何錯誤碼,則不會有任何異步完成。 傳回 ERROR_IO_PENDING 以外的值,表示呼叫已經同步失敗。 如果對等分發 API 傳回 ERROR_IO_PENDING,呼叫端必須等候非同步操作完成。
異步完成的錯誤碼可以用下列兩種方式之一來擷取:
I/O 完成埠基於完成機制
使用者藉由為下列 API 函式提供完成埠句柄和完成金鑰,以叫用 I/O 完成埠機制:
PeerDistRegisterForStatusChangeNotification
PeerDistServerPublishStream
PeerDistServerOpenContentInformation
PeerDistClientOpenContent
用戶藉由呼叫 createIoCompletionPort來建立完成埠。 此完成埠句柄可以同時用於其他非同步 I/O 作業和對等分配特定作業。
呼叫端應該使用 GetQueuedCompletionStatus 函式來管理異步完成。 如果異步作失敗,GetQueuedCompletionStatus 函式會傳回 FALSE,GetLastError 會傳回適當的錯誤碼。 如果錯誤碼不是 ERROR_SUCCESS,呼叫端應該忽略 重疊 結構中的所有欄位。 如果 GetQueuedCompletionStatus 函式傳回 TRUE,則異步操作會成功。
如需詳細資訊,請參閱 I/O 完成埠。
事件型完成
如果呼叫者將有效的事件句柄設定為 OVERLAPPED 結構的 hEvent 字段,對等散佈會使用它來發出信號,表示相關聯的異步 I/O 作業已完成。
線程呼叫者可以透過在某個等候函式中指定 重疊 結構的手動重設事件物件的句柄,來管理重疊操作。 當事件收到訊號之後,呼叫端必須呼叫peerGetOverlappedResult , 傳入適當的 重疊 結構。 PeerGetOverlappedResult 會傳回 FALSE,而呼叫端必須呼叫 getLastError ,才能擷取錯誤碼。 如果錯誤碼不是 ERROR_SUCCESS,呼叫端應該忽略 重疊 結構的所有欄位。 如果 PeerGetOverlappedResult 函式傳回 TRUE,異步操作就會成功。
如果呼叫端同時提供完成埠和事件,則事件將作為完成機制使用。
Windows 7: 使用 GetOverlappedResult 函式,而不是 PeerGetOverlappedResult。