一、获取目前已连接网卡IP
WORD w = MAKEWORD(1, 1);
WSADATA wsaData;
WSAStartup(w, &wsaData); // 加载套接字库
struct hostent *host_info = gethostbyname("");
in_addr PcAddr;
for (int i=0;;i++)
{
char *p = host_info->h_addr_list[i];
if (NULL==p)
{
break;
}
memcpy(&(PcAddr.S_un.S_addr),p,host_info->h_length);
char*szIP = ::inet_ntoa(PcAddr);
printf("ip地址:%s\n",szIP);
}
WSACleanup();
二、获取正在使用的网卡信息
void CClientDlg::FreeIpForwardTable(PMIB_IPFORWARDTABLE pIpRouteTab)
{
if (pIpRouteTab != NULL)
{
::GlobalFree(pIpRouteTab);
pIpRouteTab = NULL;
}
}
PMIB_IPFORWARDTABLE CClientDlg::GetIpForwardTable(BOOL bOrder)
{
PMIB_IPFORWARDTABLE pIpRouteTab = NULL;
DWORD dwActualSize = 0;
// 查询所需缓冲区的大小
if (::GetIpForwardTable(pIpRouteTab, &dwActualSize, bOrder) == ERROR_INSUFFICIENT_BUFFER)
{
// 为MIB_IPFORWARDTABLE结构申请内存
pIpRouteTab = (PMIB_IPFORWARDTABLE)::GlobalAlloc(GPTR, dwActualSize);
// 获取路由表
if (::GetIpForwardTable(pIpRouteTab, &dwActualSize, bOrder) == NO_ERROR)
return pIpRouteTab;
::GlobalFree(pIpRouteTab);
}
return NULL;
}
std::string CClientDlg::GetSystemIpAddress()
{
std::string strLoalhostIp;
PMIB_IPFORWARDTABLE pIpRouteTable = GetIpForwardTable(TRUE);
if (pIpRouteTable != NULL)
{
DWORD dwCurrIndex;
struct in_addr inadDest;
struct in_addr inadMask;
struct in_addr inadGateway;
char szDestIp[128] = { 0 };
char szMaskIp[128] = { 0 };
char szGatewayIp[128] = { 0 };
DWORD IfIndex = 0;
DWORD ForwardMetric1 = 0;
if (pIpRouteTable->dwNumEntries > 0)
{
int i = 0;
for (i = 0; i < pIpRouteTable->dwNumEntries; i++)
{
dwCurrIndex = pIpRouteTable->table[i].dwForwardIfIndex;
// 目的地址
inadDest.s_addr = pIpRouteTable->table[i].dwForwardDest;
strcpy_s(szDestIp, sizeof(szDestIp), inet_ntoa(inadDest));
// 子网掩码
inadMask.s_addr = pIpRouteTable->table[i].dwForwardMask;
strcpy_s(szMaskIp, sizeof(szDestIp), inet_ntoa(inadMask));
// 网关地址
inadGateway.s_addr = pIpRouteTable->table[i].dwForwardNextHop;
strcpy_s(szGatewayIp, sizeof(szDestIp), inet_ntoa(inadGateway));
if ((strcmp(szDestIp, "0.0.0.0") == 0) && (strcmp(szMaskIp, "0.0.0.0") == 0))
{
if (i == 0)
{
ForwardMetric1 = pIpRouteTable->table[i].dwForwardMetric1;
IfIndex = pIpRouteTable->table[i].dwForwardIfIndex;
struct in_addr inadDest;
inadDest.s_addr = pIpRouteTable->table[i].dwForwardDest;
}
else if (ForwardMetric1 > pIpRouteTable->table[i].dwForwardMetric1)
{
ForwardMetric1 = pIpRouteTable->table[i].dwForwardMetric1;
IfIndex = pIpRouteTable->table[i].dwForwardIfIndex;
struct in_addr inadDest;
inadDest.s_addr = pIpRouteTable->table[i].dwForwardDest;
}
}
}
}
else
{
FreeIpForwardTable(pIpRouteTable);
return "";
}
FreeIpForwardTable(pIpRouteTable);
if (IfIndex > 0)
{
DWORD ipdwSize = 0;
PBYTE m_pBuffer = new BYTE[MAX_PATH];
ULONG m_ulSize = MAX_PATH;
DWORD m_dwResult;
PMIB_IPADDRTABLE pAddrTable;
PMIB_IPADDRROW pAddrRow;
in_addr ia;
GetIpAddrTable((PMIB_IPADDRTABLE)m_pBuffer, &m_ulSize, TRUE);
delete[] m_pBuffer;
m_pBuffer = new BYTE[m_ulSize];
if (NULL != m_pBuffer)
{
m_dwResult = GetIpAddrTable((PMIB_IPADDRTABLE)m_pBuffer, &m_ulSize, TRUE);
if (m_dwResult == NO_ERROR)
{
pAddrTable = (PMIB_IPADDRTABLE)m_pBuffer;
for (int x = 0; x < pAddrTable->dwNumEntries; x++)
{
pAddrRow = (PMIB_IPADDRROW) &(pAddrTable->table[x]);
ia.S_un.S_addr = pAddrRow->dwAddr;
char IPMsg[100] = { 0 };
if (IfIndex == pAddrRow->dwIndex)
{
LPCSTR psz = inet_ntoa(ia);
if (psz)
{
strLoalhostIp = psz;
}
delete[] m_pBuffer;
return strLoalhostIp;
}
}
}
delete[] m_pBuffer;
}
}
}
else
{
FreeIpForwardTable(pIpRouteTable);
return 0;
}
return 0;
}
三、获取正在使用的网卡MAC地址
实际测试,有线网卡未连接时仍被获取到。
wstring CClientDlg::GetNetInfoFromRegister()
{
wstring wstrRet;
TCHAR szMac[MAX_PATH] = { 0 };
int nBuffSize = MAX_PATH;
wstring nError;
if (szMac == NULL || nBuffSize < 18)
return nError;
HKEY hKey = NULL;
HKEY hKey2 = NULL;
TCHAR szKey[MAX_PATH], szBuffer[MAX_PATH];
TCHAR szServiceName[MAX_PATH];
TCHAR szFileName[MAX_PATH] = { 0 };
DWORD dwRet = 0;
DWORD dwType = 0;
DWORD cbData = 0;
DWORD cName = _countof(szBuffer);
if (RegOpenKey(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards\\"), &hKey) != ERROR_SUCCESS)
return nError;
for (int i = 0; RegEnumKeyEx(hKey, i, szBuffer, &cName, NULL, NULL, NULL, NULL) == ERROR_SUCCESS; ++i, cName = _countof(szBuffer))
{
_tcscpy_s(szKey, MAX_PATH, _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards\\"));
_tcscat_s(szKey, MAX_PATH, szBuffer);
if (RegOpenKey(HKEY_LOCAL_MACHINE, szKey, &hKey2) != ERROR_SUCCESS)
{
continue;
}
dwType = REG_SZ;
cbData = MAX_PATH * sizeof(TCHAR);
if (RegQueryValueEx(hKey2, _T("ServiceName"), NULL, &dwType, (LPBYTE)szServiceName, &cbData) == ERROR_SUCCESS)
{
//读取成功后关闭句柄
RegCloseKey(hKey2);
_tcscpy_s(szFileName, MAX_PATH, _T("\\\\.\\"));
_tcscat_s(szFileName, MAX_PATH, szServiceName);
HANDLE hFile = CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if (hFile != INVALID_HANDLE_VALUE) {
DWORD dwInBuff = 0x01010101;
BYTE outBuff[MAX_PATH];
dwRet = DeviceIoControl(hFile, 0x00170002, &dwInBuff, sizeof(dwInBuff), outBuff, sizeof(outBuff), &cbData, NULL);
//无论成功失败关闭文件句柄
CloseHandle(hFile);
hFile = INVALID_HANDLE_VALUE;
if (dwRet)
{
_stprintf_s(
szMac, nBuffSize / sizeof(TCHAR),
_T("%02X-%02X-%02X-%02X-%02X-%02X"),
outBuff[0], outBuff[1], outBuff[2],
outBuff[3], outBuff[4], outBuff[5]
);
break;
}
}
}
else
{
//读取失败关闭句柄
RegCloseKey(hKey2);
}
}//end for
if (hKey != NULL)
{
RegCloseKey(hKey);
}
//std::string MAC;
int iLen = WideCharToMultiByte(CP_ACP, 0, szMac, -1, NULL, 0, NULL, NULL);
char* chRtn = new char[iLen * sizeof(char)];
WideCharToMultiByte(CP_ACP, 0, szMac, -1, chRtn, iLen, NULL, NULL);
//MAC = chRtn;
//return MAC;
wstrRet = AnsiToUnicode(chRtn);
return wstrRet;
}