Enumerazione dei cloud
Durante l'enumerazione dei cloud, un'applicazione deve fornire l'ambito della ricerca dei cloud. Dopo aver identificato l'ambito, l'applicazione può avviare il processo di enumerazione.
La procedura seguente identifica le chiamate che devono essere effettuate per enumerare i cloud.
Per enumerare i cloud
- Chiamare WSALookupServiceBegin per avviare il processo e restituire un handle.
- Chiamare WSALookupServiceNext per recuperare un set di cloud e quindi chiamare questa funzione fino a quando l'applicazione non ha recuperato tutti i cloud.
- Chiamare WSALookupServiceEnd per completare l'enumerazione.
Esempio: enumerazione e stampa dei nomi dei cloud locali di collegamento disponibili
#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;
}