直接連線
對等圖形和對等群組基礎結構可讓應用程式直接連線到一個節點, (Graphing) 或成員 (群組) ,然後直接與節點交換資料。 此連線稱為 直接連線。
使用對等圖形基礎結構的直接連線
在圖表中的兩個節點之間建立直接連線之前,必須註冊兩個節點, 才能註冊PEER_GRAPH_EVENT_DIRECT_CONNECTION 事件。 若要透過直接連線接收資料,節點也必須註冊 PEER_GRAPH_EVENT_INCOMING_DATA 事件。
PEER_GRAPH_EVENT_DIRECT_CONNECTION 是一個事件,通知應用程式直接連線嘗試是否成功或失敗。 呼叫 PeerGraphOpenDirectConnection 的實際成功或失敗狀態會在 PEER_GRAPH_EVENT_DATA 結構中傳回。
若要建立直接連線,應用程式會呼叫 PeerGraphOpenDirectConnection,然後將控制碼傳遞給圖形、參與連接之其他節點的識別指標,以及參與節點之 IPv6 位址結構的指標。 呼叫 PeerGraphOpenDirectConnection 中指定的節點身分識別和 IPv6 位址必須註冊 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 是事件,事件會通知應用程式直接連線嘗試成功或失敗。 對 PeerGroupOpenDirectConnection 呼叫的實際成功或失敗狀態會在 PEER_GROUP_EVENT_DATA 結構中傳回。
若要建立直接連線,應用程式會呼叫 PeerGroupOpenDirectConnection,然後將控制碼傳遞至群組、將參與此連線之其他成員的身分識別指標,以及參與成員的 IPv6 位址結構的指標。 在對 PeerGroupOpenDirectConnection 的呼叫中指定其身分識別和 IPv6 位址的成員必須註冊 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;
}