Mendaftarkan Nama Serekan
Untuk mendaftarkan nama serekan, aplikasi harus memberikan informasi berikut:
- Daftar alamat IP
- Identitas serekan
- Nama serekan
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;
}