方法一:
void main()
{
int i;
int s32Num = 0;
NCB ncb;
LANA_ENUM lana_enum;
typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff [30];
}ASTAT, * PASTAT;
ASTAT Adapter;
unsigned char *pu8Data;
unsigned char uRetCode;
memset( &ncb, 0, sizeof(ncb) );
memset( &lana_enum, 0, sizeof(lana_enum));
ncb.ncb_command = NCBENUM;
ncb.ncb_buffer = (unsigned char *) &lana_enum;
ncb.ncb_length = sizeof(LANA_ENUM);
uRetCode = Netbios( &ncb );
if( uRetCode != NRC_GOODRET )
{
return -1;
}
for(i = 0; i < min(lana_enum.length, SDKID_MAX_NUM); i ++)
{
memset( &ncb, 0, sizeof(ncb) );
ncb.ncb_command = NCBRESET;
ncb.ncb_lana_num = lana_enum.lana[i];
uRetCode = Netbios( &ncb );
if( uRetCode != NRC_GOODRET )
{
continue;
}
memset( &ncb, 0, sizeof(ncb) );
ncb.ncb_command = NCBASTAT;
ncb.ncb_lana_num = lana_enum.lana[i];
strcpy( (char* )ncb.ncb_callname, "*" );
ncb.ncb_buffer = (unsigned char *) &Adapter;
ncb.ncb_length = sizeof(Adapter);
uRetCode = Netbios( &ncb );
if( uRetCode != NRC_GOODRET )
{
continue;
}
pu8Data = Adapter.adapt.adapter_address;
printf("mac: %02X-%02X-%02X-%02X-%02X-%02X", pu8Data[0], pu8Data[1], pu8Data[2], pu8Data[3], pu8Data[4], pu8Data[5]);
}
}
方法二:
#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
#pragma comment(lib,"Iphlpapi.lib")
void main()
{
// 初始化winsock
PIP_ADAPTER_INFO pAdapterInfo;
DWORD dwRetVal;
ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);
pAdapterInfo = (PIP_ADAPTER_INFO)malloc(ulOutBufLen);
dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen);
// 第一次调用GetAdapterInfo获取ulOutBufLen大小
if (dwRetVal == ERROR_BUFFER_OVERFLOW)
{
free(pAdapterInfo);
pAdapterList = NULL;
pAdapterInfo = (PIP_ADAPTER_INFO)malloc(ulOutBufLen);
dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen);
}
if (dwRetVal == NO_ERROR)
{
PIP_ADAPTER_INFO pAdapter = pAdapterInfo;
while (pAdapter)
{
printf("Adapter Name: \t%s\n", pAdapter->AdapterName);
printf("Adapter Desc: \t%s\n", pAdapter->Description);
printf("MAC Addr: \t%02x-%02x-%02x-%02x-%02x-%02x\n",
pAdapter->Address[0],
pAdapter->Address[1],
pAdapter->Address[2],
pAdapter->Address[3],
pAdapter->Address[4],
pAdapter->Address[5]);
printf("IP Address: \t%s\n", pAdapter->IpAddressList.IpAddress.String);
printf("IP Mask: \t%s\n", pAdapter->IpAddressList.IpMask.String);
printf("Gateway: \t%s\n", pAdapter->GatewayList.IpAddress.String);
pAdapter = pAdapter->Next;
}// end while
}
else
{
printf("Call to GetAdaptersInfo failed.\n");
}
if (pAdapterInfo != NULL)
{
free(pAdapterInfo);
}
return 0;
} //end main
方法三:
#pragma comment(lib, "IPHLPAPI.lib")
#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
int main()
{
MIB_IPADDRTABLE *pIPAddrTable;
DWORD dwSize = 0;
DWORD dwRetVal;
pIPAddrTable = (MIB_IPADDRTABLE*) malloc( sizeof(MIB_IPADDRTABLE) );
if (GetIpAddrTable(pIPAddrTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) {
free( pIPAddrTable );
pIPAddrTable = (MIB_IPADDRTABLE *) malloc ( dwSize );
}
if ( (dwRetVal = GetIpAddrTable( pIPAddrTable, &dwSize, 0 )) != NO_ERROR ) {
printf("GetIpAddrTable call failed with %d/n", dwRetVal);
}
printf("IP Address: %ld/n", pIPAddrTable->table[0].dwAddr);
printf("IP Mask: %ld/n", pIPAddrTable->table[0].dwMask);
printf("IF Index: %ld/n", pIPAddrTable->table[0].dwIndex);
printf("Broadcast Addr: %ld/n", pIPAddrTable->table[0].dwBCastAddr);
printf("Re-assembly size: %ld/n", pIPAddrTable->table[0].dwReasmSize);
if (pIPAddrTable)
free(pIPAddrTable);
return 0;
}