Enumerating Clouds (Windows CE 5.0)
When it enumerates clouds, an application must provide the scope of the search for clouds. After the scope is identified, the application can begin the enumeration process. Peer Name Resolution Protocol (PNRP) uses Winsock functions to resolve peer names.
To enumerate clouds
Start the enumeration resolution process by calling the WSALookupServiceBegin (Windows Sockets) function.
For more information about values to pass in WSALookupServiceBegin parameters, see WSALookupServiceBegin Parameter Values for Enumerating Clouds.
To match the queries specified in the previous call to WSALookupServiceBegin, call the WSALookupServiceNext (Windows Sockets) function. The results of the WSALookupServiceNext function are determined by settings in the WSAQUERYSET structure passed in the initial WSALookupServiceBegin function call.
For more information about values to pass in WSALookupServiceBegin parameters, see WSALookupServiceNext Parameter Values for Enumerating Clouds.
To complete the enumeration process, call the WSALookupServiceEnd (Windows Sockets) function. Pass the handle obtained from the previous call to WSALookupServiceBegin.
A call to WSALookupServiceEnd terminates the cloud enumeration process.
The following code example shows how to enumerate and print the names of available link-local clouds.
//------------------------------------------------------------------------
//Function: PrintLinkLocalClouds
//Purpose: Enumerate and print the names of available link-local clouds.
//Returns: DWORD
//------------------------------------------------------------------------
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;
}
See Also
Peer-to-Peer Application Development
Send Feedback on this topic to the authors