//------------------------------------------------------------------------------ utf8::String SockAddr::gethostname(bool noThrow,const utf8::String & def) { SockAddr addr; int32_t err = 0; utf8::String s; APIAutoInitializer ksockAPIAutoInitializer; #if defined(__WIN32__) || defined(__WIN64__) ksys::Array<IpInfo> addresses; getAdaptersAddresses(addresses); if( ksys::isWinXPorLater() || iphlpapi.GetAdaptersAddresses != NULL ){ IP_ADAPTER_ADDRESSES * pAddress = &addresses[0].addresses_; while( pAddress != NULL ){ // exclude loopback interface if( pAddress->IfType == MIB_IF_TYPE_LOOPBACK ) continue; if( pAddress->PhysicalAddressLength == 0 ) continue; PIP_ADAPTER_UNICAST_ADDRESS unicast = pAddress->FirstUnicastAddress; while( unicast != NULL ){ #ifdef IP_ADAPTER_ADDRESS_PRIMARY if( unicast->Flags & (IP_ADAPTER_ADDRESS_DNS_ELIGIBLE | IP_ADAPTER_ADDRESS_PRIMARY) ){ #else if( unicast->Flags & IP_ADAPTER_ADDRESS_DNS_ELIGIBLE ){ #endif addr.clear(); //ksys::reverseByteArray( memcpy( &addr.addr4_, unicast->Address.lpSockaddr, unicast->Address.iSockaddrLength ); //addr.addr4_.sin_family = unicast->Address.lpSockaddr->sa_family; try { err = 0; s = addr.resolveAddr(); } catch( ksys::ExceptionSP & e ){ err = e->code() >= ksys::errorOffset ? e->code() - ksys::errorOffset : e->code(); } if( err == 0 ) break; } unicast = unicast->Next; } if( err == 0 ) break; pAddress = pAddress->Next; } } else {