Bagikan melalui


Mendaftarkan Nama Serekan

Untuk mendaftarkan nama serekan, aplikasi harus memberikan informasi berikut:

Jika nama serekan tidak aman, identitas bersifat opsional. Jika identitas serekan ditentukan sebagai NULL, Protokol Resolusi Nama Serekan (PNRP) menggunakan identitas serekan internal dan default.

Mendaftarkan Nama Serekan

Setelah daftar alamat IP, identitas serekan, dan nama serekan diidentifikasi, aplikasi dapat mendaftarkan nama serekan dengan memanggil WSASetService. Gunakan panduan di bagian berikut dari topik ini untuk membuat konfigurasi yang diperlukan ke parameter WSASetService dan struktur WSAQUERYSET .

Mengonfigurasi WSASetService

Saat aplikasi memanggil WSASetService, parameter harus dikonfigurasi sesuai dengan spesifikasi berikut:

  • essOperation harus memiliki nilai RNRSERVICE_REGISTER.
  • dwFlags harus nol (0).
  • lpqsRegInfo harus menunjuk ke struktur WSAQUERYSET , yang harus dikonfigurasi dengan menggunakan panduan di bagian Mengonfigurasi WSAQUERYSET berikut dari topik ini.

Mengonfigurasi WSAQUERYSET

Struktur WSAQUERYSET harus dikonfigurasi sesuai dengan spesifikasi berikut:

  • dwSize harus menentukan ukuran struktur WSAQUERYSET .
  • lpszServiceInstanceName harus menunjuk ke nama serekan yang sedang didaftarkan.
  • lpBlob harus menunjuk ke struktur PNRPINFO .
  • lpcsaBuffer harus menunjuk ke daftar alamat.

Catatan

Anggota yang tersisa dijelaskan dalam PNRP dan WSASetService.

 

Setelah nama serekan terdaftar, informasi tersedia untuk Infrastruktur Serekan. Namun, ada keterlambatan antara waktu pendaftaran dan penyebaran informasi pendaftaran ke simpul lain. Selama waktu itu, simpul lain mungkin tidak dapat menyelesaikan rekan yang baru terdaftar.

Contoh Mendaftarkan Nama Serekan

Cuplikan kode berikut menunjukkan kepada Anda cara mendaftarkan nama serekan dengan memberikan informasi yang benar saat memanggil WSASetService menggunakan struktur 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;
}