2013-10-04 2 views
0

Вот моя функция для получения и вывода IP-адреса беспроводной сети en1.My Get IP Address C Функция не выводит правильное значение

char* getIPAddress(char* src) 
{ 

    struct ifaddrs *ifaddr, *ifa; 
    int family; 

    if (getifaddrs(&ifaddr) == -1) { 
     perror("getifaddrs"); 
     exit(EXIT_FAILURE); 
    } 

    for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { 
     if (ifa->ifa_addr == NULL) 
      continue; 
     family = ifa->ifa_addr->sa_family; 
     if (0 == strcmp(ifa->ifa_name,"en1") && (family == AF_INET)) { // v4 
      // en1 

      inet_ntop(ifa->ifa_addr->sa_family,&((struct sockaddr_in*)ifa)->sin_addr,src,sizeof(struct sockaddr_in)); 
     } 
    } 

    freeifaddrs(ifaddr); 
    return src; 
} 

Я бы ожидал чего-то 129.10.10.50 или что-то в этом роде, но прямо сейчас он выводит пробел.

+0

Если соединение неактивно какое-то время, это может произойти. Отправка фиктивного пакета обычно устраняет эту проблему. Я не уверен, что строка «en1» должна быть «en0» ... это то, что я видел раньше, если у вас нет нескольких адаптеров. ... на linux вы можете использовать/proc/net/arp – technosaurus

+0

Вы проверили, действительно ли ваш оператор 'if' с вызовом' inet_ntop() 'на самом деле оценивает значение true и выполняет? –

ответ

2

Это неверно:

inet_ntop(
    ifa->ifa_addr->sa_family, 
    &((struct sockaddr_in*)ifa)->sin_addr, // <--- casting wrong variable 
    src, 
    sizeof(struct sockaddr_in) 
); 

Вы бросаете struct ifaddrs в struct sockaddr_in вместо него это член:

struct ifaddrs { 
    struct ifaddrs *ifa_next; /* Next item in list */ 
    char   *ifa_name; /* Name of interface */ 
    unsigned int  ifa_flags; /* Flags from SIOCGIFFLAGS */ 

    struct sockaddr *ifa_addr; /* Address of interface */ // <--- this one 

    struct sockaddr *ifa_netmask; /* Netmask of interface */ 
    union { 
     struct sockaddr *ifu_broadaddr; 
         /* Broadcast address of interface */ 
     struct sockaddr *ifu_dstaddr; 
         /* Point-to-point destination address */ 
    } ifa_ifu; 
#define    ifa_broadaddr ifa_ifu.ifu_broadaddr 
#define    ifa_dstaddr ifa_ifu.ifu_dstaddr 
    void   *ifa_data; /* Address-specific data */ 
}; 

Это исправить:

inet_ntop(
    ifa->ifa_addr->sa_family, 
    &((struct sockaddr_in*)ifa->ifa_addr)->sin_addr, // ifa_addr member instead 
    src, 
    sizeof(struct sockaddr_in) 
); 

Вы также можете выйти из цикла.

+0

Я получаю Нет источника для «memmove $ VARIANT $ sse3x() в 0x7fff86e75ee2» при попытке сделать один шаг функцией inet_ntop. – lilzz

+0

Просмотр и запуск тестового кода в coliru: http://coliru.stacked-crooked.com/a/bd2889fc9d4bc07f – goji

+0

Правильно выводит IP-адрес хоста. – goji

Смежные вопросы