直接連線
對等圖形和對等群組基礎結構可讓應用程式直接連線到一個節點(Graphing)或成員(群組),然後直接與節點交換數據。 此連線稱為 直接連線。
使用對等圖形基礎結構的直接連線
在圖形中的兩個節點之間建立直接連線之前,必須註冊這兩個節點,才能註冊 PEER_GRAPH_EVENT_DIRECT_CONNECTION 事件。 若要透過直接連線接收數據,節點也必須註冊 PEER_GRAPH_EVENT_INCOMING_DATA 事件。
PEER_GRAPH_EVENT_DIRECT_CONNECTION 事件會通知應用程式直接連線嘗試是否成功或失敗。 呼叫 PeerGraphOpenDirectConnection 的實際成功或失敗狀態會在 PEER_GRAPH_EVENT_DATA 結構中傳回。
若要建立直接連線,應用程式會呼叫 PeerGraphOpenDirectConnection,然後將句柄傳遞至圖形、參與連接之其他節點的識別指標,以及參與節點的 IPv6 位址結構的指標。 呼叫中所指定的節點識別和 IPv6 位址 PeerGraphOpenDirectConnection 必須註冊 PEER_GRAPH_EVENT_INCOMING_DATA 事件,否則無法接收呼叫對等所傳送的數據。 成功時,PeerGraphOpenDirectConnection 會傳回 64 位聯機標識碼。 不過,對等必須等候 PEER_GROUP_EVENT_DIRECT_CONNECTION 事件,才能將直接連線標識碼識別為有效。
建立連線並確認有效的連線標識符之後,應用程式可以呼叫 PeerGraphSendData,將有效連線標識碼所指定的聯機數據傳送至參與對等,如果參與對等已註冊 PEER_GRAPH_EVENT_INCOMING_DATA 事件。 不透明數據可在 PEER_GRAPH_EVENT_INCOMING_DATA 事件所傳回的 PEER_EVENT_INCOMING_DATA 中,以 PEER_DATA 結構的形式提供。
不需要連線時,應用程式會使用圖形句柄和聯機標識符呼叫 PeerGraphCloseDirectConnection。
使用對等群組基礎結構的直接連線
對等群組基礎結構內的直接聯機會處理,類似於對等圖形基礎結構。
在群組中的兩個成員之間建立直接連線之前,這兩個成員都必須註冊 PEER_GROUP_EVENT_DIRECT_CONNECTION 事件。 如果群組成員想要透過直接連線接收數據,群組成員也必須註冊 PEER_GROUP_EVENT_INCOMING_DATA 事件。
PEER_GROUP_EVENT_DIRECT_CONNECTION 是事件,該事件會通知應用程式是否直接連線嘗試成功或失敗。 PEER_GROUP_EVENT_DATA 結構中會傳回對 PeerGroupOpenDirectConnection 呼叫的實際成功或失敗狀態。
若要建立直接連線,應用程式會呼叫 PeerGroupOpenDirectConnection,然後將句柄傳遞至群組、將參與此連線之其他成員的身分識別指標,以及參與成員的 IPv6 位址結構的指標。 身分識別和 IPv6 位址是在對 peerGroupOpenDirectConnection 呼叫中指定的成員,必須註冊 PEER_GROUP_EVENT_INCOMING_DATA 事件,或者成員無法接收呼叫對等所傳送的數據。 PeerGroupOpenDirectConnection 成功時傳回 64 位連線標識符。 不過,對等必須等候引發 PEER_GRAPH_EVENT_DIRECT_CONNECTION 事件,才能將直接連線標識碼識別為有效。
建立連線並確認有效的連線標識碼之後,應用程式就可以呼叫 PeerGroupSendData,以透過有效連線標識碼所指定的連線傳送數據給參與的對等,如果參與對等,如果參與對等已註冊 PEER_GROUP_EVENT_INCOMING_DATA 事件。 不透明數據可作為 PEER_GROUP_EVENT_INCOMING_DATA 事件所傳回之 PEER_EVENT_INCOMING_DATA 中的 PEER_DATA 結構。
不需要連線時,應用程式會使用群組句柄和聯機標識符呼叫 PeerGroupCloseDirectConnection。
圖形的直接連線範例
#include <p2p.h>
#pragma comment(lib, "p2pgraph.lib")
//-----------------------------------------------------------------------------
// Function: CreateDirectConnection
//
// Purpose: Demonstrate how to create a direct connection.
//
// Arguments:
// hGraph - the graph in which to create the connection
// pwzId - the peer identification string
//
// Returns: ULONGLONG - the connection id or 0
//
ULONGLONG CreateDirectConnection(HGRAPH hGraph, PCWSTR pwzId)
{
HRESULT hr = S_OK;
ULONGLONG ullConnection = 0; // the connection id to return
HPEERENUM hPeerEnum = NULL;
hr = PeerGraphEnumNodes(hGraph, pwzId, &hPeerEnum);
if (SUCCEEDED(hr))
{
ULONG cItem = 1; // want only one matching result
PEER_NODE_INFO ** ppNodeInfo = NULL;
hr = PeerGraphGetNextItem(hPeerEnum, &cItem, (PVOID**) &ppNodeInfo);
if (SUCCEEDED(hr))
{
if ((cItem > 0) && (NULL != ppNodeInfo))
{
if ((*ppNodeInfo)->cAddresses > 0)
{
hr = PeerGraphOpenDirectConnection(hGraph, pwzId,
&(*ppNodeInfo)->pAddresses[0], &ullConnection);
}
PeerGraphFreeData(ppNodeInfo);
}
}
PeerGraphEndEnumeration(hPeerEnum);
}
return ullConnection;
}