Partager via


Inscription d’un nom d’homologue

Pour inscrire un nom d’homologue, une application doit fournir les informations suivantes :

Si un nom d’homologue n’est pas sécurisé, une identité est facultative. Si une identité d’homologue est spécifiée comme NULL, le protocole PNRP (Peer Name Resolution Protocol) utilise une identité d’homologue interne par défaut.

Inscription d’un nom d’homologue

Une fois la liste d’adresses IP, l’identité de l’homologue et le nom de l’homologue identifiés, l’application peut inscrire un nom d’homologue en appelant WSASetService. Utilisez les instructions des sections suivantes de cette rubrique pour effectuer les configurations requises pour les paramètres WSASetService et la structure WSAQUERYSET .

Configuration de WSASetService

Lorsqu’une application appelle WSASetService, les paramètres doivent être configurés selon les spécifications suivantes :

  • essOperation doit avoir la valeur RNRSERVICE_REGISTER.
  • dwFlags doit être égal à zéro (0).
  • lpqsRegInfo doit pointer vers une structure WSAQUERYSET , qui doit être configurée à l’aide des instructions de la section Configuration de WSAQUERYSET suivante de cette rubrique.

Configuration de WSAQUERYSET

La structure WSAQUERYSET doit être configurée selon les spécifications suivantes :

  • dwSize doit spécifier la taille de la structure WSAQUERYSET .
  • lpszServiceInstanceName doit pointer vers le nom de l’homologue en cours d’inscription.
  • lpBlob doit pointer vers une structure PNRPINFO .
  • lpcsaBuffer doit pointer vers la liste d’adresses.

Notes

Les membres restants sont décrits dans PNRP et WSASetService.

 

Une fois qu’un nom d’homologue est inscrit, les informations sont disponibles pour l’infrastructure d’homologue. Toutefois, il existe un délai entre l’heure d’inscription et la propagation des informations d’inscription à d’autres nœuds. Pendant ce temps, d’autres nœuds peuvent ne pas être en mesure de résoudre l’homologue nouvellement inscrit.

Exemple d’inscription d’un nom d’homologue

L’extrait de code suivant montre comment inscrire un nom d’homologue en fournissant les informations correctes lors de l’appel de WSASetService à l’aide de la structure 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;
}