Несколько лет спустя ...
Просто столкнулся с той же проблемой и нашел решение. Вы можете использовать GetAdaptersInfo (), чтобы получить все локальные адаптеры, а затем прокрутить список и выбрать первый с допустимой маской подсети и шлюзом по умолчанию (у моего адаптера VPN его не было).
Если у вас есть и WiFi, и Ethernet со шлюзами по умолчанию !!, я думаю, вы можете использовать поле Тип, чтобы выбрать Ethernet ..
Это похоже на пример кода для GetAdaptersInfo () в MSDN.
PIP_ADAPTER_INFO pAdapterInfo;
PIP_ADAPTER_INFO pAdapter = NULL;
DWORD dwRetVal = 0;
PIP_ADDR_STRING pIPAddrString, pIPGwString;
ULONG ulOutBufLen;
pAdapterInfo = (IP_ADAPTER_INFO *)malloc( sizeof( IP_ADAPTER_INFO ) );
if( !pAdapterInfo ); //Malloc Failed
ulOutBufLen = sizeof( IP_ADAPTER_INFO );
if( GetAdaptersInfo( pAdapterInfo, &ulOutBufLen ) == ERROR_BUFFER_OVERFLOW ) {
free( pAdapterInfo );
pAdapterInfo = (IP_ADAPTER_INFO *)malloc( ulOutBufLen );
if( !pAdapterInfo ); //Malloc Failed
}
if( ( dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) ) == NO_ERROR ) {
pAdapter = pAdapterInfo;
while( pAdapter ) {
pIPAddrString = &pAdapter->IpAddressList;
pIPGwString = &pAdapter->GatewayList;
while( pIPAddrString ) {
ULONG ulIPMask, ulIPGateway;
ulIPMask = ntohl( inet_addr( pIPAddrString->IpMask.String ) );
ulIPGateway = ntohl( inet_addr( pIPGwString->IpAddress.String ) );
if( !ulIPMask ) {
pIPAddrString = pIPAddrString->Next;
continue;
}
//First adapter with a default gateway
if ( ulIPGateway ) {
strncpy( GETYOURSTRINGHERE, pIPAddrString->IpAddress.String, sizeof(pIPAddrString->IpAddress.String));
free( pAdapterInfo );
return;
}
pIPAddrString = pIPAddrString->Next;
}
pAdapter = pAdapter->Next;
}
}
if ( pAdapterInfo )
free( pAdapterInfo );