Share via


ピア名の登録

ピア名を登録するには、アプリケーションで次の情報を指定する必要があります。

ピア名がセキュリティで保護されていない場合、ID は省略可能です。 ピア ID が NULL として指定されている場合、ピア名解決プロトコル (PNRP) は内部の既定のピア ID を使用します。

ピア名の登録

IP アドレス一覧、ピア ID、ピア名が識別された後、アプリケーションは WSASetService を呼び出してピア名を登録できます。 WSASetService パラメーターと WSAQUERYSET 構造体に必要な構成を行うには、このトピックの次のセクションのガイドラインを使用します。

WSASetService の構成

アプリケーションが WSASetService を呼び出す場合、パラメーターは次の仕様に従って構成する必要があります。

  • essOperation には 、RNRSERVICE_REGISTERの値が必要です。
  • dwFlags はゼロ (0) である必要があります。
  • lpqsRegInfoWSAQUERYSET 構造体を指す必要があります。この構造体は、このトピックの「 WSAQUERYSET の構成」 セクションのガイドラインを使用して構成する必要があります。

WSAQUERYSET の構成

WSAQUERYSET 構造体は、次の仕様に従って構成する必要があります。

  • dwSize では、 WSAQUERYSET 構造体のサイズを指定する必要があります。
  • lpszServiceInstanceName は、登録されているピア名を指している必要があります。
  • lpBlob はPNRPINFO 構造体を指している必要があります。
  • lpcsaBuffer は アドレス一覧を指す必要があります。

注意

残りのメンバーについては、 PNRP と WSASetService を参照してください。

 

ピア名が登録されると、ピア インフラストラクチャで情報を使用できるようになります。 ただし、登録時間と登録情報の他のノードへの伝達には遅延があります。 その間、他のノードが新しく登録されたピアを解決できない場合があります。

ピア名の登録例

次のコード スニペットは、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;
}