Condividi tramite


Registrazione di un nome peer

Per registrare un nome peer, un'applicazione deve fornire le informazioni seguenti:

Se un nome peer non è protetto, un'identità è facoltativa. Se viene specificata un'identità peer come NULL, il protocollo PNRP (Peer Name Resolution Protocol) usa un'identità peer interna e predefinita.

Registrazione di un nome peer

Dopo aver identificato l'elenco di indirizzi IP, l'identità peer e il nome peer, l'applicazione può registrare un nome peer chiamando WSASetService. Usare le linee guida nelle sezioni seguenti di questo argomento per eseguire le configurazioni necessarie ai parametri WSASetService e alla struttura WSAQUERYSET .

Configurazione di WSASetService

Quando un'applicazione chiama WSASetService, i parametri devono essere configurati in base alle specifiche seguenti:

  • essOperation deve avere un valore di RNRSERVICE_REGISTER.
  • dwFlags deve essere zero (0).
  • lpqsRegInfo deve puntare a una struttura WSAQUERYSET , che deve essere configurata usando le linee guida nella sezione Configurazione di WSAQUERYSET di questo argomento.

Configurazione di WSAQUERYSET

La struttura WSAQUERYSET deve essere configurata in base alle specifiche seguenti:

  • dwSize deve specificare le dimensioni della struttura WSAQUERYSET .
  • lpszServiceInstanceName deve puntare al nome peer registrato.
  • lpBlob deve puntare a una struttura PNRPINFO .
  • lpcsaBuffer deve puntare all'elenco indirizzi.

Nota

I membri rimanenti sono descritti in PNRP e WSASetService.

 

Dopo la registrazione di un nome peer, le informazioni sono disponibili per l'infrastruttura peer. Tuttavia, esiste un ritardo tra il tempo di registrazione e la propagazione delle informazioni di registrazione ad altri nodi. Durante questo periodo, altri nodi potrebbero non essere in grado di risolvere il peer appena registrato.

Esempio di registrazione di un nome peer

Il frammento di codice seguente illustra come registrare un nome peer fornendo le informazioni corrette quando si chiama WSASetService usando la struttura 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;
}