#define MAX_ADAPTER_DESCRIPTION_LENGTH 128
#define MAX_ADAPTER_ADDRESS_LENGTH 8
//表示IP的结构
typedef struct
{
char String[4*4];
} IP_ADDRESS_STRING, *PIP_ADDRESS_STRING, IP_MASK_STRING, *PIP_MASK_STRING;
typedef struct _IP_ADDR_STRING
{
struct _IP_ADDR_STRING* Next; //下一个节点
IP_ADDRESS_STRING IpAddress; //IP地址
IP_MASK_STRING IpMask; //子网掩码
DWORD Context;
} IP_ADDR_STRING, *PIP_ADDR_STRING;
typedef struct _IP_ADAPTER_INFO
{
struct _IP_ADAPTER_INFO* Next; //结构列表的下一个节点
DWORD ComboIndex; //保留
char AdapterName[MAX_ADAPTER_NAME_LENGTH+4]; //网卡名称
char Description[MAX_ADAPTER_DESCRIPTION_LENGTH+4]; //网卡描述
UINT AddressLength; //网卡地址长度
BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH]; //MAC地址
DWORD Index; //网络接口索引号
UINT Type; //网络接口类型
UINT DhcpEnabled; //是否启用DHCP
PIP_ADDR_STRING CurrentIpAddress; //当前IP地址
IP_ADDR_STRING IpAddressList; //IP地址列表
IP_ADDR_STRING GatewayList; //网关地址列表
IP_ADDR_STRING DhcpServer; //DHCP服务器地址
BOOL HaveWins; //是否启动了Wins服务
IP_ADDR_STRING PrimaryWinsServer; //主Wins服务地址
IP_ADDR_STRING SecondaryWinsServer; //次Wins服务
time_t LeaseObtained; //DHCP租赁时间
time_t LeaseExpires; //DHCP租赁失效时间
} IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;
//声明iphlpapi.dll中需要调用参数的调用方式为__stdcall,及参数类型
typedef DWORD (__stdcall* PGAINFO)(PIP_ADAPTER_INFO, PULONG);
void CLocalHostInfo::GetLocalInfo()
{
UpdateData(TRUE);
HMODULE hInst = LoadLibrary("iphlpapi.dll");
if(!hInst)
AfxMessageBox("iphlpapi.dll no supported in this platform!\n");
PGAINFO pGAInfo = (PGAINFO)GetProcAddress(hInst, "GetAdaptersInfo"); //检索指定的iphlpapi.dll动态链接库(DLL)中的输出库函数地址
if(pGAInfo == NULL)
{
AfxMessageBox("can't found GetAdapterInfo function!\n");
exit(0);
}
ULONG ulSize = 0;
PIP_ADAPTER_INFO pInfo=NULL, d=NULL;
while(pGAInfo(pInfo, &ulSize) != ERROR_SUCCESS)
{
delete pInfo;
int eSize = ulSize/sizeof(IP_ADAPTER_INFO);
if(ulSize%sizeof(IP_ADAPTER_INFO))
{
eSize++;
}
pInfo = (PIP_ADAPTER_INFO)new(IP_ADAPTER_INFO[eSize]);
}
//GetAdapterInfo返回的是一个键表结构的网卡信息,可以用循环遍历得到每一个网卡的信息
int nCount = 0;
d=pInfo;
for(d=pInfo; d!=NULL; d=d->Next)
{
CString szNetInfo;
szNetInfo.Format("%s", d->Description);
++nCount;
m_Adapter.AddString(szNetInfo);
if(nCount != 3)
{
m_ip.Format("%s", d->IpAddressList.IpAddress.String);
m_mask.Format("%s", d->IpAddressList.IpMask.String);
m_Gateway.Format("%s", d->GatewayList.IpAddress.String);
m_mac.Format("%02X-%02X-%02X-%02X-%02X-%02X", d->Address[0], d->Address[1],
d->Address[2], d->Address[3],
d->Address[4], d->Address[5]);
}
UpdateData(FALSE);
}
m_Adapter.SetCurSel(0);
/*
算法:
1. 子网掩码与IP地址进行位与运算,得处网络地址
2. 网络地址 | (~子网掩码),得出广播地址
*/
/*
in_addr broadcast;
string ip,mask;
ip = m_ip.GetBuffer(0);
mask = m_mask.GetBuffer(0);
broadcast.S_un.S_addr = (
inet_addr(ip.c_str())
& inet_addr(mask.c_str())
)
| (~inet_addr(mask.c_str()));
CString broadcastIP= inet_ntoa(broadcast);
*/
delete []pInfo;
delete []d;
FreeLibrary(hInst);
}
BOOL CLocalHostInfo::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
GetLocalInfo();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
特别说明:上面的一下变量m_这类型的都是MFC控件定义的。还有就是上面的一下可以需要一些库文件,看看需要什么自己下载加上就行