Compartilhar via


Registrando um nome de par

Para registrar um nome de par, um aplicativo deve fornecer as seguintes informações:

Se um nome de par não for seguro, uma identidade será opcional. Se uma identidade de par for especificada como NULL, o protocolo PNRP usará uma identidade de par interna e padrão.

Registrando um nome de par

Depois que a lista de endereços IP, a identidade do par e o nome do par forem identificados, o aplicativo poderá registrar um nome de par chamando WSASetService. Use as diretrizes nas seções a seguir deste tópico para fazer as configurações necessárias para os parâmetros WSASetService e a estrutura WSAQUERYSET .

Configurando WSASetService

Quando um aplicativo chama WSASetService, os parâmetros devem ser configurados de acordo com as seguintes especificações:

  • essOperation deve ter um valor de RNRSERVICE_REGISTER.
  • dwFlags deve ser zero (0).
  • LpqsRegInfo deve apontar para uma estrutura WSAQUERYSET , que deve ser configurada usando as diretrizes na seguinte seção Configurando WSAQUERYSET deste tópico.

Configurando o WSAQUERYSET

A estrutura WSAQUERYSET deve ser configurada de acordo com as seguintes especificações:

  • dwSize deve especificar o tamanho da estrutura WSAQUERYSET .
  • lpszServiceInstanceName deve apontar para o nome do par que está sendo registrado.
  • lpBlob deve apontar para uma estrutura PNRPINFO .
  • lpcsaBuffer deve apontar para a lista de endereços.

Observação

Os membros restantes são descritos em PNRP e WSASetService.

 

Depois que um nome de par é registrado, as informações ficam disponíveis para a Infraestrutura de Pares. No entanto, há um atraso entre o tempo de registro e a propagação das informações de registro para outros nós. Durante esse tempo, outros nós podem não ser capazes de resolve o par recém-registrado.

Exemplo de registro de um nome de par

O snippet de código a seguir mostra como registrar um nome de par fornecendo as informações corretas ao chamar WSASetService usando a estrutura WSAQUERYSET .

#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;
}