Freigeben über


Registrieren eines Peernamens

Um einen Peernamen zu registrieren, muss eine Anwendung die folgenden Informationen bereitstellen:

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;
}