Énumération des clouds
Lors de l’énumération de clouds, une application doit fournir l’étendue de la recherche de clouds. Une fois l’étendue identifiée, l’application peut commencer le processus d’énumération.
La procédure suivante identifie les appels qui doivent être effectués pour énumérer les clouds.
Pour énumérer les clouds
- Appelez WSALookupServiceBegin pour commencer le processus et retourner un handle.
- Appelez WSALookupServiceNext pour récupérer un ensemble de clouds, puis appelez cette fonction jusqu’à ce que l’application ait récupéré tous les clouds.
- Appelez WSALookupServiceEnd pour terminer l’énumération.
Exemple : Énumération et impression des noms des liens disponibles - Clouds locaux
#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;
}