以下代码只适用于有一个网卡的情况,多个网卡时,应该禁用多余的网卡。
//查询网卡信息时用 #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也为空的信息。至于多个网卡时的先后顺序没有进一步研究。