共用方式為


直接連線

對等圖形和對等群組基礎結構可讓應用程式直接連線到一個節點, (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;
}