共用方式為


註冊對等名稱

若要註冊對等名稱,應用程式必須提供下列資訊:

如果對等名稱不安全,則身分識別是選擇性的。 如果將對等識別指定為 Null,則對等名稱解析通訊協定 (PNRP) 會使用內部、預設的對等識別。

註冊對等名稱

識別 IP 位址清單、對等識別和對等名稱之後,應用程式可以呼叫 WSASetService來註冊對等名稱。 使用本主題下列各節中的指導方針,對 WSASetService 參數和 WSAQUERYSET 結構進行必要的設定。

設定 WSASetService

當應用程式呼叫 WSASetService時,必須根據下列規格來設定參數:

  • essOperation 的值必須是 RNRSERVICE_REGISTER
  • dwFlags 必須是零 (0) 。
  • lpqsRegInfo 必須指向 WSAQUERYSET 結構,此結構必須使用本主題的設定 WSAQUERYSET 一節中的指導方針進行設定。

設定 WSAQUERYSET

WSAQUERYSET結構必須根據下列規格進行設定:

  • dwSize 必須指定 WSAQUERYSET 結構的大小。
  • lpszServiceInstanceName 必須指向要註冊的對等名稱。
  • lpBlob 必須指向 PNRPINFO 結構。
  • lpcsaBuffer 必須指向通訊清單。

注意

其餘成員會在 PNRP 和 WSASetService中描述。

 

註冊對等名稱之後,即可取得對等基礎結構的資訊。 不過,註冊時間與將註冊資訊傳播至其他節點之間會有延遲。 在此期間,其他節點可能無法解析新註冊的對等。

註冊對等名稱的範例

下列程式碼片段示範如何使用WSAQUERYSET結構呼叫WSASetService時提供正確的資訊來註冊對等名稱。

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