Registrar un nombre del mismo nivel
Para registrar un nombre del mismo nivel, una aplicación debe proporcionar la siguiente información:
- Lista de direcciones IP
- Identidad del mismo nivel
- Nombre del mismo nivel
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;
}