Registrieren eines Peernamens
Um einen Peernamen zu registrieren, muss eine Anwendung die folgenden Informationen bereitstellen:
- IP-Adressliste
- Peeridentität
- Peername
Wenn ein Peername nicht gesichert ist, ist eine Identität optional. Wenn eine Peeridentität als NULL angegeben wird, verwendet das Peer Name Resolution Protocol (PNRP) eine interne Standard-Peeridentität.
Registrieren eines Peernamens
Nachdem die IP-Adressliste, die Peeridentität und der Peername identifiziert wurden, kann die Anwendung einen Peernamen registrieren, indem sie WSASetService aufruft. Verwenden Sie die Richtlinien in den folgenden Abschnitten dieses Themas, um die erforderlichen Konfigurationen für die WSASetService-Parameter und die WSAQUERYSET-Struktur vorzunehmen.
Konfigurieren von WSASetService
Wenn eine Anwendung WSASetService aufruft, müssen die Parameter gemäß den folgenden Spezifikationen konfiguriert werden:
- essOperation muss den Wert RNRSERVICE_REGISTER haben.
- dwFlags muss null (0) sein.
- lpqsRegInfo muss auf eine WSAQUERYSET-Struktur verweisen, die mithilfe der Richtlinien im folgenden Abschnitt Konfigurieren von WSAQUERYSET dieses Themas konfiguriert werden muss.
Konfigurieren von WSAQUERYSET
Die WSAQUERYSET-Struktur muss gemäß den folgenden Spezifikationen konfiguriert werden:
- dwSize muss die Größe der WSAQUERYSET-Struktur angeben.
- lpszServiceInstanceName muss auf den Peernamen verweisen, der registriert wird.
- lpBlob muss auf eine PNRPINFO-Struktur verweisen.
- lpcsaBuffer muss auf die Adressliste verweisen.
Hinweis
Die restlichen Member werden in PNRP und WSASetService beschrieben.
Nachdem ein Peername registriert wurde, stehen die Informationen für die Peerinfrastruktur zur Verfügung. Es gibt jedoch eine Verzögerung zwischen der Registrierungszeit und der Weitergabe der Registrierungsinformationen an andere Knoten. Während dieser Zeit können andere Knoten den neu registrierten Peer möglicherweise nicht auflösen.
Beispiel für die Registrierung eines Peernamens
Der folgende Codeausschnitt zeigt, wie Sie einen Peernamen registrieren, indem Sie beim Aufrufen von WSASetService mithilfe der WSAQUERYSET-Struktur die richtigen Informationen bereitstellen.
#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;
}