Enumerar nubes
Al enumerar nubes, una aplicación debe proporcionar el ámbito de la búsqueda de nubes. Una vez identificado el ámbito, la aplicación puede comenzar el proceso de enumeración.
El siguiente procedimiento identifica las llamadas que se deben realizar para enumerar nubes.
Para enumerar nubes
- Llame a WSALookupServiceBegin para comenzar el proceso y devolver un identificador.
- Llame a WSALookupServiceNext para recuperar un conjunto de nubes y, a continuación, llame a esta función hasta que la aplicación haya recuperado todas las nubes.
- Llame a WSALookupServiceEnd para finalizar la enumeración.
Ejemplo: Enumeración e impresión de los nombres de nubes locales de vínculo disponibles
#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;
}