Udostępnij za pośrednictwem


Rejestrowanie nazwy równorzędnej

Aby zarejestrować nazwę elementu równorzędnego, aplikacja musi podać następujące informacje:

Jeśli nazwa elementu równorzędnego jest niezabezpieczona, tożsamość jest opcjonalna. Jeśli tożsamość równorzędna jest określona jako NULL, protokół PNRP (Protokół Rozpoznawania Nazw Równorzędnych) używa wewnętrznej, domyślnej tożsamości równorzędnej.

Rejestrowanie nazwy peera

Po zidentyfikowaniu listy adresów IP, tożsamości oraz nazwy elementu równorzędnego, aplikacja może zarejestrować nazwę tego elementu, wywołując WSASetService. Skorzystaj z wytycznych w poniższych sekcjach tego tematu, aby wprowadzić wymagane konfiguracje do parametrów WSASetService oraz struktury WSAQUERYSET.

Konfigurowanie usługi WSASetService

Gdy aplikacja wywołuje WSASetService, parametry muszą być skonfigurowane zgodnie z następującymi specyfikacjami:

  • essOperation musi mieć wartość RNRSERVICE_REGISTER.
  • dwFlags musi mieć wartość zero (0).
  • lpqsRegInfo musi wskazywać na strukturę WSAQUERYSET, która musi być skonfigurowana zgodnie z wytycznymi w sekcji Konfigurowanie WSAQUERYSET tego tematu.

Konfigurowanie zestawu WSAQUERYSET

Struktura WSAQUERYSET musi być skonfigurowana zgodnie z następującymi specyfikacjami:

  • dwSize musi określać rozmiar struktury WSAQUERYSET.
  • lpszServiceInstanceName musi wskazywać nazwę elementu równorzędnego, która jest zarejestrowana.
  • lpBlob musi wskazywać strukturę PNRPINFO.
  • lpcsaBuffer musi wskazywać listę adresów.

Notatka

Pozostali członkowie są opisani w PNRP i WSASetService .

 

Po zarejestrowaniu nazwy elementu równorzędnego informacje są dostępne dla infrastruktury równorzędnej. Jednak między czasem rejestracji a propagacją informacji rejestracyjnych do innych węzłów występuje opóźnienie. W tym czasie inne węzły mogą nie być w stanie rozpoznać nowo zarejestrowanego elementu równorzędnego.

Przykład rejestrowania nazwy równorzędnej

Poniższy fragment kodu pokazuje, jak zarejestrować nazwę rówieśnika, poprzez podanie poprawnych informacji podczas wywoływania WSASetService przy użyciu struktury 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;
}