Поделиться через


Отмена регистрации имени однорангового узла

При отмене регистрации имени однорангового узла зарегистрированное имя удаляется из облака PNRP.

Отмена регистрации имени однорангового узла

Чтобы отменить регистрацию имени однорангового узла, вызовите WSASetService. Параметр essOperation должен иметь значение RNRSERVICE_DELETE. Используйте рекомендации, приведенные в следующих разделах этого раздела, чтобы настроить необходимые конфигурации для параметров WSASetService и структуры WSAQUERYSET .

Настройка WSASetService

Когда приложение вызывает WSASetService, параметры должны быть настроены в соответствии со следующими спецификациями:

  • essOperation должно иметь значение RNRSERVICE_DELETE.
  • Значения dwFlags должны быть равны нулю (0).
  • lpqsRegInfo должен указывать на структуру 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: PnrpUnregister
//
// Purpose:  Unregister the given name from a PNRP cloud
//
// Arguments:
//   pwzIdentity : identity string originally used to register the name
//   pwzName     : name to unregister from PNRP
//   pwzCloud    : name of the cloud to unregister from, NULL = global cloud
//
// Returns:  HRESULT
//
HRESULT PnrpUnregister(PWSTR pwzIdentity, PWSTR pwzName, PWSTR pwzCloud)
{
    HRESULT         hr = S_OK;
    PNRPINFO        pnrpInfo = {0};
    BLOB            blPnrpData = {0};
    WSAQUERYSET     querySet = {0};
    INT             iRet;

    //
    // build the WSAQUERYSET required to unregister
    //
    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.lpServiceClassId = (LPGUID)&SVCID_PNRPNAME;
    querySet.lpszServiceInstanceName = pwzName;
    querySet.lpszContext = pwzCloud;
    querySet.lpBlob = &blPnrpData;

    // unregister the name with PNRP
    iRet = WSASetService(&querySet, RNRSERVICE_DELETE, 0);
    if (iRet != 0)
    {
        hr = HRESULT_FROM_WIN32(WSAGetLastError());
    }

    return hr;
}