직접 연결
피어 그래프 및 피어 그룹화 인프라를 사용하면 애플리케이션이 한 노드(그래프) 또는 멤버(그룹화)에 직접 연결한 다음 노드와 직접 데이터를 교환할 수 있습니다. 이 연결을 직접 연결이라고 합니다.
피어 그래프 인프라를 사용한 직접 연결
그래프의 두 노드 간에 직접 연결을 설정하려면 먼저 두 노드를 모두 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;
}