获取电脑网卡信息

以下代码只适用于有一个网卡的情况,多个网卡时,应该禁用多余的网卡。

//查询网卡信息时用
#include <iphlpapi.h>
#pragma comment(lib, "IPHLPAPI.lib")

SOCKADDR_IN IP_addr;

ULONG outBufLen = 15000;//15k内存空间
PIP_ADAPTER_ADDRESSES  pAddresses;
PIP_ADAPTER_ADDRESSES  pAddresses1;//备份指针,释放内存时用
pAddresses = (IP_ADAPTER_ADDRESSES *)malloc(outBufLen);	//此处不能用new,会造成buffer溢出,不知道为什么
pAddresses1 = pAddresses;//备份指针
if(GetAdaptersAddresses( AF_INET, 0, NULL, pAddresses, &outBufLen ) == NO_ERROR)//获取所有网卡信息
{
	int index;
	for( index=0;index<6;index++ )
	{
		if( 0 != pAddresses->PhysicalAddress[index] )
		{
			//MAC地址不是全零,说明此网卡信息有效,提取信息,一会内存就释放了
			//MAC地址
			m_Parameter.SeverMAC.addr[0] = pAddresses->PhysicalAddress[0];
			m_Parameter.SeverMAC.addr[1] = pAddresses->PhysicalAddress[1];
			m_Parameter.SeverMAC.addr[2] = pAddresses->PhysicalAddress[2];
			m_Parameter.SeverMAC.addr[3] = pAddresses->PhysicalAddress[3];
			m_Parameter.SeverMAC.addr[4] = pAddresses->PhysicalAddress[4];
			m_Parameter.SeverMAC.addr[5] = pAddresses->PhysicalAddress[5];
			//IP地址
			IP_addr = *(SOCKADDR_IN *)pAddresses->FirstUnicastAddress->Address.lpSockaddr;
			break;
		}			
	}		
	if( 6 == index )
	{	//MAC地址全零,网卡未启用
		MessageBox( "网卡未启用!" );
		free( pAddresses1 );//通过备份指针释放内存
		return TRUE;
	}
}
else
{
	MessageBox( "获取本机MAC地址失败!" );
	free( pAddresses1 );//通过备份指针释放内存
	return TRUE;
}
pAddresses = pAddresses->Next;//指针顺着链表后移
if( pAddresses )
{	//有第二个网卡
	for( int index=0;index<6;index++ )
	{
		if( 0 != pAddresses->PhysicalAddress[index] )
		{
			MessageBox( "本机有多个网卡,请禁用多余的网卡!" );
			free( pAddresses1 );//通过备份指针释放内存
			return TRUE;
		}			
	}
	//走到这,说明第二块网卡的MAC地址为全0,没有启用
}
free( pAddresses1 );//通过备份指针释放内存

IP_addr.sin_addr;//IP地址

GetAdaptersAddresses函数返回电脑上的所有网卡信息,放在pAddresses指向的内存。pAddresses是个链表,里边有个Next指针,指向下一个网卡信息,如果有多个网卡,就会是一串。通过测试,规律如下:函数返回所有启用的网卡信息,然后在最后追加一个MAC地址为全零的网卡信息并且Next指针指向空。比如只有一个启用网卡,该网卡的Next非空,指向下一个MAC为全零而且其Next也为空的网卡信息。比如没有网卡启用,pAddresses指向的第一个网卡信息就是这个MAC为全零而且其Next也为空的信息。至于多个网卡时的先后顺序没有进一步研究。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值