Inscription d’un nom d’homologue
Pour inscrire un nom d’homologue, une application doit fournir les informations suivantes :
- Liste d’adresses IP
- Identité d’homologue
- Nom de l’homologue
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;
}