다음을 통해 공유


직접 연결

피어 그래프 및 피어 그룹화 인프라를 사용하면 애플리케이션이 한 노드(그래프) 또는 멤버(그룹화)에 직접 연결한 다음 노드와 직접 데이터를 교환할 수 있습니다. 이 연결을 직접 연결이라고 합니다.

피어 그래프 인프라를 사용한 직접 연결

그래프의 두 노드 간에 직접 연결을 설정하려면 먼저 두 노드를 모두 PEER_GRAPH_EVENT_DIRECT_CONNECTION 이벤트에 등록해야 합니다. 직접 연결을 통해 데이터를 수신하려면 노드도 PEER_GRAPH_EVENT_INCOMING_DATA 이벤트에 등록해야 합니다.

PEER_GRAPH_EVENT_DIRECT_CONNECTION 직접 연결 시도가 성공 또는 실패하는지 여부를 애플리케이션에 알릴 수 있는 이벤트입니다. PeerGraphOpenDirectConnection 호출의 실제 성공 또는 실패 상태 PEER_GRAPH_EVENT_DATA 구조에 반환됩니다.

직접 연결을 만들기 위해 애플리케이션은 PeerGraphOpenDirectConnection을 호출한 다음, 그래프에 핸들, 연결에 참여하는 다른 노드의 ID에 대한 포인터 및 참여하는 노드의 IPv6 주소 구조에 대한 포인터를 전달합니다. PeerGraphOpenDirectConnection 호출에 지정된 노드 ID 및 IPv6 주소는 PEER_GRAPH_EVENT_INCOMING_DATA 이벤트에 대해 등록해야 합니다. 그렇지 않으면 호출 피어에서 보낸 데이터를 받을 수 없습니다. 성공하면 PeerGraphOpenDirectConnection 은 64비트 연결 ID를 반환합니다. 그러나 피어는 직접 연결 ID가 유효한 것으로 식별되기 전에 PEER_GROUP_EVENT_DIRECT_CONNECTION 이벤트를 기다려야 합니다.

연결이 만들어지고 유효한 연결 ID가 확인되면 애플리케이션은 PeerGraphSendData 를 호출하여 참여하는 피어가 PEER_GRAPH_EVENT_INCOMING_DATA 이벤트에 등록된 경우 유효한 연결 ID로 지정된 연결을 통해 데이터를 참여 피어에 보낼 수 있습니다. 불투명 데이터는 PEER_GRAPH_EVENT_INCOMING_DATA 이벤트에서 반환된 PEER_EVENT_INCOMING_DATA PEER_DATA 구조체로 사용할 수 있습니다.

연결이 필요하지 않은 경우 애플리케이션은 그래프 핸들 및 연결 ID를 사용하여 PeerGraphCloseDirectConnection 을 호출합니다.

피어 그룹화 인프라를 사용한 직접 연결

피어 그룹화 인프라 내의 직접 연결은 피어 그래프 인프라와 유사하게 처리됩니다.

그룹의 두 멤버 간에 직접 연결을 설정하려면 먼저 두 멤버가 PEER_GROUP_EVENT_DIRECT_CONNECTION 이벤트에 등록해야 합니다. 그룹 구성원이 직접 연결을 통해 데이터를 수신하려는 경우 그룹 구성원도 PEER_GROUP_EVENT_INCOMING_DATA 이벤트에 등록해야 합니다.

PEER_GROUP_EVENT_DIRECT_CONNECTION 직접 연결 시도가 성공 또는 실패하는지 여부를 애플리케이션에 알릴 수 있는 이벤트입니다. PeerGroupOpenDirectConnection 호출의 실제 성공 또는 실패 상태 PEER_GROUP_EVENT_DATA 구조에 반환됩니다.

직접 연결을 만들기 위해 애플리케이션은 PeerGroupOpenDirectConnection을 호출한 다음 그룹에 핸들, 이 연결에 참여할 다른 멤버의 ID에 대한 포인터 및 참여하는 멤버의 IPv6 주소 구조에 대한 포인터를 전달합니다. PeerGroupOpenDirectConnection 호출에서 ID 및 IPv6 주소가 지정된 멤버는 PEER_GROUP_EVENT_INCOMING_DATA 이벤트에 대해 등록해야 합니다. 그렇지 않으면 멤버가 호출 피어에서 보낸 데이터를 받을 수 없습니다. PeerGroupOpenDirectConnection 은 성공하면 64비트 연결 ID를 반환합니다. 그러나 피어는 직접 연결 ID를 유효한 것으로 식별하기 전에 PEER_GRAPH_EVENT_DIRECT_CONNECTION 이벤트가 발생할 때까지 기다려야 합니다.

연결이 만들어지고 유효한 연결 ID가 확인되면 애플리케이션이 PeerGroupSendData 를 호출하여 참여하는 피어가 PEER_GROUP_EVENT_INCOMING_DATA 이벤트에 등록된 경우 유효한 연결 ID로 지정된 연결을 통해 데이터를 참여 피어에 보낼 수 있습니다. 불투명 데이터는 PEER_GROUP_EVENT_INCOMING_DATA 이벤트에서 반환된 PEER_EVENT_INCOMING_DATA PEER_DATA 구조체로 사용할 수 있습니다.

연결이 필요하지 않은 경우 애플리케이션은 그룹 핸들 및 연결 ID를 사용하여 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;
}