다음을 통해 공유


피어 이름 등록

피어 이름을 등록하려면 애플리케이션에서 다음 정보를 제공해야 합니다.

피어 이름이 안전하지 않은 경우 ID는 선택 사항입니다. 피어 ID가 NULL로 지정된 경우 PNRP(피어 이름 확인 프로토콜)는 내부 기본 피어 ID를 사용합니다.

피어 이름 등록

IP 주소 목록, 피어 ID 및 피어 이름을 식별한 후 애플리케이션은 WSASetService를 호출하여 피어 이름을 등록할 수 있습니다. 이 항목의 다음 섹션에 있는 지침을 사용하여 WSASetService 매개 변수 및 WSAQUERYSET 구조에 필요한 구성을 만듭니다.

WSASetService 구성

애플리케이션이 WSASetService를 호출하는 경우 매개 변수는 다음 사양에 따라 구성되어야 합니다.

  • essOperation 의 값은 RNRSERVICE_REGISTER.
  • dwFlags는 0이어야 합니다.
  • lpqsRegInfo 는 이 항목의 다음 WSAQUERYSET 구성 섹션에 있는 지침을 사용하여 구성해야 하는 WSAQUERYSET 구조를 가리킵니다.

WSAQUERYSET 구성

WSAQUERYSET 구조체는 다음 사양에 따라 구성해야 합니다.

  • dwSizeWSAQUERYSET 구조체의 크기를 지정해야 합니다.
  • lpszServiceInstanceName 은 등록 중인 피어 이름을 가리킵니다.
  • lpBlobPNRPINFO 구조를 가리킵니다.
  • lpcsaBuffer는 주소 목록을 가리킵니다.

참고

나머지 멤버는 PNRP 및 WSASetService에 설명되어 있습니다.

 

피어 이름이 등록되면 피어 인프라에서 정보를 사용할 수 있습니다. 그러나 등록 시간과 등록 정보가 다른 노드로 전파되는 사이에는 지연이 있습니다. 이 시간 동안 다른 노드는 새로 등록된 피어를 resolve 수 없습니다.

피어 이름 등록 예제

다음 코드 조각에서는 WSAQUERYSET 구조를 사용하여 WSASetService를 호출할 때 올바른 정보를 제공하여 피어 이름을 등록하는 방법을 보여 줍니다.

#define UNICODE
#include <initguid.h>
#include <p2p.h>

#pragma comment(lib, "ws2_32.lib")

//-------------------------------------------------------------------------
// Function: PnrpRegister
//
// Purpose:  Register the given name in the PNRP cloud
//
// Arguments:
//   pwzIdentity : identity string created using PeerIdentityCreate
//   pwzName     : name to register in PNRP
//   pwzCloud    : name of the cloud to register in, NULL = global cloud
//   pNodeInfo   : local node info returned from 

//
// Returns:  HRESULT
//
HRESULT PnrpRegister(PWSTR pwzIdentity, PWSTR pwzName, PWSTR pwzCloud, SOCKADDR_IN6* pAddress)
{
    HRESULT         hr = S_OK;
    CSADDR_INFO     csaAddr = {0};
    PNRPINFO        pnrpInfo = {0};
    BLOB            blPnrpData = {0};
    WSAQUERYSET     querySet = {0};
    INT             iRet;

    //
    // fill a CSADDR_INFO structure from the address
    //
    csaAddr.iProtocol = IPPROTO_TCP;
    csaAddr.iSocketType = SOCK_STREAM;
    csaAddr.LocalAddr.iSockaddrLength = sizeof(SOCKADDR_IN6);
    csaAddr.LocalAddr.lpSockaddr = (LPSOCKADDR)pAddress; 

    //
    // build the WSAQUERYSET required to register
    //
    pnrpInfo.dwSize = sizeof(pnrpInfo);
    pnrpInfo.dwLifetime = 60 * 60 * 8; //8 hours
    pnrpInfo.lpwszIdentity = pwzIdentity;

    blPnrpData.cbSize = sizeof(pnrpInfo);
    blPnrpData.pBlobData = (BYTE*)&pnrpInfo;

    querySet.dwSize = sizeof(querySet);
    querySet.dwNameSpace = NS_PNRPNAME;
    querySet.dwNumberOfCsAddrs = 1; // one address
    querySet.lpServiceClassId = (LPGUID)&SVCID_PNRPNAME;
    querySet.lpszServiceInstanceName = pwzName;
    querySet.lpszContext = pwzCloud;
    querySet.lpszComment = L"SomeComment";
    querySet.lpcsaBuffer = &csaAddr;
    querySet.lpBlob = &blPnrpData;

    // register the name with PNRP
    iRet = WSASetService(&querySet, RNRSERVICE_REGISTER, 0);
    if (iRet != 0)
    {
        hr = HRESULT_FROM_WIN32(WSAGetLastError());
    }
    
    return hr;
}