Перечисление облаков
При перечислении облаков приложение должно предоставлять область поиска облаков. После определения область приложение может начать процесс перечисления.
Следующая процедура определяет вызовы, которые необходимо выполнить для перечисления облаков.
Перечисление облаков
- Вызовите WSALookupServiceBegin , чтобы начать процесс и вернуть дескриптор.
- Вызовите WSALookupServiceNext , чтобы получить набор облаков, а затем вызывайте эту функцию, пока приложение не извлечет все облака.
- Вызовите WSALookupServiceEnd , чтобы завершить перечисление.
Пример. Перечисление и печать имен доступных локальных облаков ссылок
#define UNICODE
#include <initguid.h>
#include <p2p.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")
DWORD PrintLinkLocalClouds()
{
WSAQUERYSETW qset;
BLOB Blob;
PNRPCLOUDINFO CloudInfo;
HANDLE hLookup = NULL;
int err;
DWORD dwErr = NO_ERROR;
DWORD dwSize;
WSAQUERYSETW *pResults = NULL;
ZeroMemory(&qset, sizeof(qset));
ZeroMemory(&CloudInfo, sizeof(CloudInfo));
CloudInfo.dwSize = sizeof(PNRPCLOUDINFO);
CloudInfo.Cloud.Scope = PNRP_LINK_LOCAL_SCOPE;
Blob.cbSize = sizeof(PNRPCLOUDINFO);
Blob.pBlobData = (LPBYTE)&CloudInfo;
qset.dwSize = sizeof(WSAQUERYSET);
qset.dwNameSpace = NS_PNRPCLOUD;
qset.lpServiceClassId = (LPGUID)&SVCID_PNRPCLOUD;
qset.lpBlob = &Blob;
//
// Start enumeration
//
err = WSALookupServiceBegin(
&qset,
LUP_RETURN_NAME,
&hLookup);
if(err !=0)
{
return WSAGetLastError();
}
// getting results
while(TRUE)
{
//
// Get size
//
ZeroMemory(&qset, sizeof(qset));
dwSize = sizeof(qset);
pResults = &qset;
err = WSALookupServiceNext(
hLookup,
0,
&dwSize,
pResults
);
if(err != 0)
{
dwErr = WSAGetLastError();
}
if(dwErr != NO_ERROR)
{
if(dwErr == WSA_E_NO_MORE)
{
//
// No more entries
//
dwErr = ERROR_SUCCESS;
break;
}
else if (dwErr == WSAEFAULT)
{
//
// This usually means result buffer too small. Allocate space
//
pResults = (WSAQUERYSET *)malloc(dwSize);
if(pResults == NULL)
{
dwErr = ERROR_OUTOFMEMORY;
break;
}
//
// Get cloud name
//
err = WSALookupServiceNext(
hLookup,
0,
&dwSize,
pResults
);
if(err == 0)
{
wprintf(L"%s\n", pResults->lpszServiceInstanceName);
dwErr = NO_ERROR;
}
else
{
dwErr = WSAGetLastError();
}
free(pResults);
if(dwErr != NO_ERROR)
{
break;
}
}
else
{
//
// Some other unexpected error
//
break;
}
}
else
{
//
// Should never happen
//
dwErr = ERROR_GEN_FAILURE;
break;
}
}
//
// Close the enumeration
//
WSALookupServiceEnd(hLookup);
return dwErr;
}