Регистрация имени однорангового узла
Чтобы зарегистрировать имя однорангового узла, приложение должно предоставить следующие сведения:
- Список IP-адресов
- Удостоверение однорангового узла
- Имя однорангового узла
Если имя однорангового узла не защищено, удостоверение является необязательным. Если одноранговое удостоверение задано как NULL, протокол PNRP использует внутреннее одноранговое удостоверение по умолчанию.
Регистрация имени однорангового узла
После определения списка IP-адресов, удостоверения однорангового узла и имени однорангового узла приложение может зарегистрировать имя однорангового узла, вызвав WSASetService. Используйте рекомендации, приведенные в следующих разделах этого раздела, чтобы настроить необходимые конфигурации для параметров WSASetService и структуры WSAQUERYSET .
Настройка WSASetService
Когда приложение вызывает WSASetService, параметры должны быть настроены в соответствии со следующими спецификациями:
- essOperation должно иметь значение RNRSERVICE_REGISTER.
- Значения dwFlags должны быть равны нулю (0).
- lpqsRegInfo должен указывать на структуру WSAQUERYSET , которая должна быть настроена с помощью рекомендаций, приведенных в следующем разделе Настройка WSAQUERYSET этого раздела.
Настройка WSAQUERYSET
Структура WSAQUERYSET должна быть настроена в соответствии со следующими спецификациями:
- DwSize должен указать размер структуры WSAQUERYSET .
- Значение lpszServiceInstanceName должно указывать на имя регистрируемого однорангового узла.
- lpBlob должен указывать на структуру PNRPINFO .
- lpcsaBuffer должен указывать на список адресов.
Примечание
Остальные элементы описаны в разделах PNRP и WSASetService.
После регистрации имени однорангового узла сведения будут доступны инфраструктуре одноранговых узлов. Однако между временем регистрации и распространением сведений о регистрации на другие узлы существует задержка. В течение этого времени другие узлы могут не разрешить только что зарегистрированный одноранговый узел.
Пример регистрации имени однорангового узла
В следующем фрагменте кода показано, как зарегистрировать имя однорангового узла, предоставив правильные сведения при вызове WSASetService с помощью структуры 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;
}