mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
212 lines
4.7 KiB
212 lines
4.7 KiB
/*++
|
|
|
|
Copyright(c) 2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
NLB Manager
|
|
|
|
File Name:
|
|
|
|
nlbhost.cpp
|
|
|
|
Abstract:
|
|
|
|
Implementation of class NLBHost
|
|
|
|
NLBHost is responsible for connecting to an NLB host and getting/setting
|
|
its NLB-related configuration.
|
|
|
|
History:
|
|
|
|
03/31/01 JosephJ Created
|
|
|
|
--*/
|
|
|
|
|
|
#include "stdafx.h"
|
|
#include "private.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// The one and only application object
|
|
|
|
CWinApp theApp;
|
|
|
|
|
|
void test(int argc, WCHAR* argv[]);
|
|
|
|
int __cdecl wmain(int argc, WCHAR* argv[], WCHAR* envp[])
|
|
{
|
|
int nRetCode = 0;
|
|
|
|
// initialize MFC and print and error on failure
|
|
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
|
|
{
|
|
// TODO: change error code to suit your needs
|
|
cerr << L"Fatal Error: MFC initialization failed" << endl;
|
|
nRetCode = 1;
|
|
}
|
|
else
|
|
{
|
|
test(argc, argv);
|
|
}
|
|
|
|
return nRetCode;
|
|
}
|
|
|
|
|
|
VOID
|
|
MyLogger(
|
|
PVOID Context,
|
|
const WCHAR * Text
|
|
)
|
|
{
|
|
wprintf(L"LOG: %s", Text);
|
|
wprintf(L"\n");
|
|
}
|
|
|
|
void test(int argc, WCHAR* argv[])
|
|
{
|
|
|
|
WCHAR wszBuf[1024];
|
|
NLBHost * pHost = NULL;
|
|
UINT Status = 0;
|
|
NLBHost::HostInformation *pHostInfo = NULL;
|
|
|
|
pHost = new NLBHost(
|
|
L"JOSEPHJ1C",
|
|
L"JosephJ's Dev Machine",
|
|
MyLogger,
|
|
NULL // Logger context
|
|
);
|
|
|
|
if (pHost == NULL)
|
|
{
|
|
MyLogger(NULL, L"Could not create an instance of NLBHost.");
|
|
goto end;
|
|
}
|
|
|
|
Status = pHost->Ping();
|
|
|
|
if (!NLBH_SUCCESS(Status)) goto end;
|
|
|
|
|
|
Status = pHost->GetHostInformation(
|
|
&pHostInfo
|
|
);
|
|
|
|
if (!NLBH_SUCCESS(Status))
|
|
{
|
|
pHostInfo = NULL;
|
|
goto end;
|
|
}
|
|
|
|
int NumNics = pHostInfo->nicInformation.size();
|
|
|
|
wsprintf(
|
|
wszBuf,
|
|
L"Processing host with MachineName %s(NumNics=%d)",
|
|
(LPCWSTR)pHostInfo->MachineName,
|
|
NumNics
|
|
);
|
|
MyLogger(NULL, wszBuf);
|
|
|
|
for( int i = 0; i < NumNics; i++)
|
|
{
|
|
NLBHost::NicInformation *pNicInfo;
|
|
MGR_RAW_CLUSTER_CONFIGURATION ClusterConfig;
|
|
UINT GenerationId;
|
|
UINT RequestId;
|
|
|
|
pNicInfo = &pHostInfo->nicInformation[i];
|
|
wsprintf(
|
|
wszBuf,
|
|
L"Processing NIC %s (%s)\n",
|
|
(LPCWSTR) pNicInfo->adapterGuid,
|
|
(LPCWSTR) pNicInfo->friendlyName
|
|
);
|
|
MyLogger(NULL, wszBuf);
|
|
|
|
Status = pHost->GetClusterConfiguration(
|
|
pNicInfo->adapterGuid,
|
|
&ClusterConfig,
|
|
&GenerationId
|
|
);
|
|
if (!NLBH_SUCCESS(Status))
|
|
{
|
|
// Failure...
|
|
continue;
|
|
}
|
|
|
|
|
|
Status = pHost->SetClusterConfiguration(
|
|
pNicInfo->adapterGuid,
|
|
&ClusterConfig,
|
|
GenerationId,
|
|
&RequestId
|
|
);
|
|
|
|
if (NLBH_PENDING(Status))
|
|
{
|
|
INT Delay = 1000; // 1 sec
|
|
|
|
// Give some time for the remote host's connectivity to be lost...
|
|
//
|
|
MyLogger(NULL, L"Sleeping for 5 seconds.");
|
|
Sleep(5000);
|
|
|
|
// Now wait until we can ping the host, then query for the async
|
|
// result of the SetClusterConfiguration operation.
|
|
// We keep polling for the result, sleeping increasing amounts
|
|
// in between.
|
|
//
|
|
MyLogger(NULL, L"Pinging the host ....");
|
|
while (NLBH_SUCCESS(pHost->Ping()))
|
|
{
|
|
UINT ResultCode;
|
|
_bstr_t ResultText;
|
|
|
|
MyLogger(NULL, L"Checking for asynchronous completion...");
|
|
Status = pHost->GetAsyncResult(
|
|
RequestId,
|
|
&GenerationId,
|
|
&ResultCode,
|
|
&ResultText
|
|
);
|
|
if (!NLBH_PENDING(Status))
|
|
{
|
|
break;
|
|
}
|
|
MyLogger(NULL, L"Operation still pending...");
|
|
MyLogger(NULL, L"Waiting to try again ....");
|
|
Sleep(Delay);
|
|
MyLogger(NULL, L"Pinging the host ....");
|
|
Delay *=2;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
end:
|
|
|
|
if (pHostInfo != NULL)
|
|
{
|
|
delete pHostInfo;
|
|
pHostInfo = NULL;
|
|
}
|
|
|
|
if (pHost != NULL)
|
|
{
|
|
delete pHost;
|
|
pHost = NULL;
|
|
}
|
|
|
|
return;
|
|
|
|
}
|