Registrar un nombre del mismo nivel

Para registrar un nombre del mismo nivel, una aplicación debe proporcionar la siguiente información:

Si un nombre del mismo nivel no está seguro, una identidad es opcional. Si se especifica una identidad del mismo nivel como NULL, el Protocolo de resolución de nombres del mismo nivel (PNRP) usa una identidad del mismo nivel interna y predeterminada.

Registrar un nombre del mismo nivel

Una vez identificada la lista de direcciones IP, la identidad del mismo nivel y el nombre del mismo nivel, la aplicación puede registrar un nombre del mismo nivel llamando a WSASetService. Use las instrucciones de las secciones siguientes de este tema para realizar las configuraciones necesarias para los parámetros WSASetService y la estructura WSAQUERYSET .

Configuración de WSASetService

Cuando una aplicación llama a WSASetService, los parámetros deben configurarse según las siguientes especificaciones:

  • essOperation debe tener un valor de RNRSERVICE_REGISTER.
  • dwFlags debe ser cero (0).
  • lpqsRegInfo debe apuntar a una estructura WSAQUERYSET , que debe configurarse mediante las instrucciones de la sección Configuración de WSAQUERYSET de este tema.

Configuración de WSAQUERYSET

La estructura WSAQUERYSET debe configurarse según las siguientes especificaciones:

  • dwSize debe especificar el tamaño de la estructura WSAQUERYSET .
  • lpszServiceInstanceName debe apuntar al nombre del mismo nivel que se está registrando.
  • lpBlob debe apuntar a una estructura PNRPINFO .
  • lpcsaBuffer debe apuntar a la lista de direcciones.

Nota

Los miembros restantes se describen en PNRP y WSASetService.

 

Una vez registrado un nombre del mismo nivel, la información está disponible para la infraestructura del mismo nivel. Sin embargo, hay un retraso entre el tiempo de registro y la propagación de la información de registro a otros nodos. Durante ese tiempo, es posible que otros nodos no puedan resolver el mismo nivel recién registrado.

Ejemplo de registro de un nombre del mismo nivel

El siguiente fragmento de código muestra cómo registrar un nombre del mismo nivel proporcionando la información correcta al llamar a WSASetService mediante la estructura 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;
}