// test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <Windows.h>
#include <IPHlpApi.h>
#pragma comment(lib,"Iphlpapi.lib")
#pragma comment(lib,"Ws2_32.lib")
/*
根据IP地址获取网卡适配器设备名称
OUT AdapterName:适配器名称缓冲区 IN IP:IP地址(网络字节序)
返回值:TRUE 成功获取
*/
BOOL GetAdapterByIp(PCHAR AdapterName, ULONG IP)
{
ULONG ulAdapterInfoSize = sizeof(IP_ADAPTER_INFO);
IP_ADAPTER_INFO *pAdapterInfo = (IP_ADAPTER_INFO*)new char[ulAdapterInfoSize];
IP_ADAPTER_INFO *pAdapterInfoEnum = NULL;
if( GetAdaptersInfo(pAdapterInfo, &ulAdapterInfoSize) == ERROR_BUFFER_OVERFLOW ){
// 缓冲区不够大
delete[] pAdapterInfo;
pAdapterInfo = (IP_ADAPTER_INFO*)new char[ulAdapterInfoSize];
}
pAdapterInfoEnum = pAdapterInfo;
if( GetAdaptersInfo(pAdapterInfoEnum, &ulAdapterInfoSize) == ERROR_SUCCESS ){
do{ //遍历所有适配器
if( pAdapterInfoEnum->Type == MIB_IF_TYPE_ETHERNET ){
// 判断是否为以太网接口
//pAdapterInfoEnum->Description 是适配器描述
//pAdapterInfoEnum->AdapterName 是适配器名称
//pAdapterInfoEnum->Address 是Mac地址
if ( inet_addr(pAdapterInfoEnum->IpAddressList.IpAddress.String) == IP ){
printf( "%s IP: %s GATEIP: %s\n ", pAdapterInfoEnum->AdapterName,
pAdapterInfoEnum->IpAddressList.IpAddress.String, pAdapterInfoEnum->GatewayList.IpAddress.String );
printf( "MAC: %02X%02X%02X%02X%02X%02X\n", pAdapterInfoEnum->Address[0],pAdapterInfoEnum->Address[1],
pAdapterInfoEnum->Address[2],pAdapterInfoEnum->Address[3],pAdapterInfoEnum->Address[4],pAdapterInfoEnum->Address[5]);
break;
}
}
pAdapterInfoEnum = pAdapterInfoEnum->Next;
}while(pAdapterInfoEnum);
}
delete []pAdapterInfo;
return FALSE;
}
void test()
{
char szName[MAX_PATH] = {0};
int err = gethostname(szName, MAX_PATH);
if( err==SOCKET_ERROR ) {
printf("gethostname fail %08x\n", WSAGetLastError());
return;
}
hostent *pHostent = gethostbyname(szName);
ULONG ulAdapterIp = *(ULONG*)pHostent->h_addr_list[0];
GetAdapterByIp(NULL,ulAdapterIp);
}
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2),&wsaData);
test();
system("pause");
return 0;
}