DragonNest/Common/NetworkLib/NetAdapters.cpp

216 lines
5.8 KiB
C++
Raw Permalink Normal View History


#include "stdafx.h"
#include "NetAdapters.h"
CNetAdapters::CNetAdapters() : m_hIpHlp(NULL), m_fnGetIpAddrTable(NULL), m_fnGetAdaptersInfo(NULL)
{
m_nError = _Init();
}
CNetAdapters::~CNetAdapters()
{
if (m_hIpHlp)
FreeLibrary(m_hIpHlp);
}
void CNetAdapters::GetFirstMacAddress(std::string &strMacAddr)
{
if (m_vAdapterList.empty())
{
m_nError = NetAdapter::ERROR_EMPTYINFO;
return;
}
/*
std::vector <sAdapterInfo>::iterator ii;
for (ii = m_vAdapterList.begin(); ii != m_vAdapterList.end(); ii++)
{
if ( strcmp((*ii).szIP, "0.0.0.0") != 0 )
{
strMacAddr = (*ii).strMacAddress;
return;
}
}
*/
strMacAddr = m_vAdapterList[0].strMacAddress;
m_nError = NetAdapter::ERROR_FIRST_SUCCESS;
}
void CNetAdapters::GetFirstPublicMacAddress(std::string &strMacAddr)
{
if (m_vAdapterList.empty())
{
m_nError = NetAdapter::ERROR_EMPTYINFO;
return;
}
strMacAddr.clear();
std::vector <sAdapterInfo>::iterator ii;
if (m_vAdapterList.size() == 1)
{
return GetFirstMacAddress(strMacAddr);
}
else
{
for (ii = m_vAdapterList.begin(); ii != m_vAdapterList.end(); ii++)
{
if ((*ii).bPublic)
{
strMacAddr = (*ii).strMacAddress;
m_nError = NetAdapter::ERROR_PUBLIC_SUCCESS;
break;
}
}
if (ii == m_vAdapterList.end())
return GetFirstMacAddress(strMacAddr);
}
}
void CNetAdapters::GetMacAddressList(std::vector<std::string> &vMacAddrList)
{
for (std::vector <sAdapterInfo>::iterator ii = m_vAdapterList.begin(); ii != m_vAdapterList.end(); ii++)
vMacAddrList.push_back((*ii).strMacAddress);
}
void CNetAdapters::GetPublicMacAddressList(std::vector<std::string> &vMacAddrList)
{
for (std::vector <sAdapterInfo>::iterator ii = m_vAdapterList.begin(); ii != m_vAdapterList.end(); ii++)
{
if ((*ii).bPublic)
vMacAddrList.push_back((*ii).strMacAddress);
}
}
int CNetAdapters::_Init()
{
if (m_hIpHlp) return false;
m_hIpHlp = LoadLibrary( _T("iphlpapi.dll") );
if (m_hIpHlp)
{
m_fnGetIpAddrTable = (fnGetIpAddrTable)GetProcAddress(m_hIpHlp, "GetIpAddrTable");
if (m_fnGetIpAddrTable == NULL)
return NetAdapter::ERROR_LPTABLE;
m_fnGetAdaptersInfo = (fnGetAdaptersInfo)GetProcAddress(m_hIpHlp, "GetAdaptersInfo");
if (m_fnGetAdaptersInfo == NULL)
return NetAdapter::ERROR_ADAPTERINFO;
_MakeNetAdapterInfo();
_FindPublicIndex(m_vAdapterList);
#if defined(_CONSOLE) && defined(_DEBUG)
for (std::vector <sAdapterInfo>::iterator ii = m_vAdapterList.begin(); ii != m_vAdapterList.end(); ii++)
{
printf("** Network Adapter Info ** \r\n** Index [%d]\r\n** Name [%s]\r\n** Desc [%s] \r\n** MacAddr [%s]\r\n** IP[%s]\r\n", (*ii).iIndex, (*ii).strAdapterName.c_str(), (*ii).strDescription.c_str(), (*ii).strMacAddress.c_str(), (*ii).szIP);
}
#endif //#if defined(_CONSOLE) && defined(_DEBUG)
return NetAdapter::ERROR_NONE;
}
return NetAdapter::ERROR_LIBRARY;
}
void CNetAdapters::_MakeNetAdapterInfo()
{
IP_ADAPTER_INFO AdapterInfo[16];
DWORD dwBufLen = sizeof(AdapterInfo);
DWORD dwStatus = m_fnGetAdaptersInfo(AdapterInfo, &dwBufLen);
_ASSERT(dwStatus == ERROR_SUCCESS);
sAdapterInfo Info;
PIP_ADAPTER_INFO pAdapterInfo = AdapterInfo;
do {
if (pAdapterInfo->AddressLength > 0 && strcmp(pAdapterInfo->IpAddressList.IpAddress.String, "0.0.0.0") != 0)
{
memset(&Info, 0, sizeof(Info));
Info.iIndex = pAdapterInfo->Index;
Info.strAdapterName = pAdapterInfo->AdapterName;
Info.strDescription = pAdapterInfo->Description;
char szMaxAddr[24];
#if defined(_ID)
sprintf_s(szMaxAddr, sizeof(szMaxAddr), "%02X:%02X:%02X:%02X:%02X:%02X", pAdapterInfo->Address[0], pAdapterInfo->Address[1], pAdapterInfo->Address[2], pAdapterInfo->Address[3], pAdapterInfo->Address[4], pAdapterInfo->Address[5]);
#else
sprintf_s(szMaxAddr, sizeof(szMaxAddr), "%02X-%02X-%02X-%02X-%02X-%02X", pAdapterInfo->Address[0], pAdapterInfo->Address[1], pAdapterInfo->Address[2], pAdapterInfo->Address[3], pAdapterInfo->Address[4], pAdapterInfo->Address[5]);
#endif
Info.strMacAddress = szMaxAddr;
sprintf_s(Info.szIP, sizeof(Info.szIP), "%s", pAdapterInfo->IpAddressList.IpAddress.String);
m_vAdapterList.push_back(Info);
}
pAdapterInfo = pAdapterInfo->Next; // Progress through linked list
}
while(pAdapterInfo); // Terminate if last adapter
}
bool CNetAdapters::_FindPublicIndex(std::vector <sAdapterInfo> &vList)
{
if(m_fnGetIpAddrTable)
{
PMIB_IPADDRTABLE pIPAddrTable;
DWORD dwSize=0;
pIPAddrTable=(MIB_IPADDRTABLE *)malloc(sizeof(MIB_IPADDRTABLE));
if(!pIPAddrTable)
return false;
if(m_fnGetIpAddrTable(pIPAddrTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER)
{
free(pIPAddrTable);
pIPAddrTable=(MIB_IPADDRTABLE *)malloc(dwSize);
if(!pIPAddrTable)
return false;
}
if(m_fnGetIpAddrTable(pIPAddrTable, &dwSize, 0) == NO_ERROR)
{
for(DWORD i=0; i<pIPAddrTable->dwNumEntries ; ++i)
{
std::vector <sAdapterInfo>::iterator ii;
for (ii = vList.begin(); ii != vList.end(); ii++)
{
if (pIPAddrTable->table[i].dwIndex == (*ii).iIndex)
break;
}
if (ii == vList.end()) continue;
DWORD dwIP = ntohl(pIPAddrTable->table[i].dwAddr);
BOOL bPrivate = FALSE;
if(CXIP_A(dwIP) == 127)
continue;
else if(CXIP_A(dwIP) == 10)
bPrivate = TRUE;
else if(CXIP_A(dwIP) == 172)
{
if(CXIP_B(dwIP) >= 16 && CXIP_B(dwIP) <= 31)
bPrivate = TRUE;
}
else if(CXIP_A(dwIP) == 192)
{
if(CXIP_B(dwIP) == 168)
bPrivate=TRUE;
}
if(bPrivate == FALSE)
(*ii).bPublic = true;
(*ii).dwPublicIP = dwIP;
DWORD dwNPublicIP = htonl((*ii).dwPublicIP);
_strcpy((*ii).szIP, _countof((*ii).szIP), inet_ntoa(*((in_addr*)&dwNPublicIP)), (int)strlen(inet_ntoa(*((in_addr*)&dwNPublicIP))));
}
}
else
{
_ASSERT_EXPR(0, L"Initfailed!!!");
return false;
}
// Clear
free(pIPAddrTable);
return true;
}
return false;
}