列舉雲端
列舉雲端時,應用程式必須提供搜尋雲端的範圍。 識別範圍之後,應用程式就可以開始列舉程式。
下列程式會識別需要列舉雲端的呼叫。
列舉雲端
- 呼叫 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;
}