середу, 14 липня 2010 р.

IP адреса без використання DNS

Раніше для того щоб отримати IP адресу я використовував gethostbyname, хоч і рекомендують її замінювати іншими. Проблеми з’являються, якщо у користувача якісь проблеми з мережою - програма просто застигає і чекає доки функція не віддасть керування (зменшити час очікування не вдається). Тому тепер я беру IP адресу з мережевого інтерфейсу (потрібно підключити ifaddrs.h):

ifaddrs *myaddrs, *ifa;
sockaddr_in *s4;
int status;
char ip[64];

status = getifaddrs(&myaddrs);
if (status != 0)
PrintLog("getifaddrs failed");

for (ifa = myaddrs; ifa != NULL; ifa = ifa->ifa_next)
{
if (ifa->ifa_addr == NULL)
continue;
if ((ifa->ifa_flags & IFF_UP) == 0)
continue;

if (ifa->ifa_addr->sa_family == AF_INET)
{
s4 = (struct sockaddr_in *)(ifa->ifa_addr);
if (inet_ntop(ifa->ifa_addr->sa_family, (void *)&(s4->sin_addr), ip, sizeof(ip)) == NULL)
PrintLog("%s: inet_ntop failed", ifa->ifa_name);
}
}
freeifaddrs(myaddrs);

Протестовано на MacOS Snow Leopard і Tiger.