2016-10-26 10 views
1

機能と間違ったIPアドレスを取得するには、IPアドレスを指定:メインで使用私はイーサネットを取得するgetifaddrs

char *get_ethernet_ip(const char *ethernet, char *ip, size_t len) { 
    struct ifaddrs *ips; 
    int rc = getifaddrs(&ips); 
    if (rc == -1) { 
     SYSLOG("getifaddrs() failed (%s)", strerror(errno)); 
     return NULL; 
    } 

    for (; ips != NULL; ips = ips->ifa_next) { 
     if (strcasecmp(ethernet, ips->ifa_name) == 0) { 
      in_addr local_ip = ((sockaddr_in *)ips->ifa_addr)->sin_addr; 
      const char *p = inet_ntop(AF_INET, &local_ip, ip, len); 
      if (p == NULL) { 
       SYSLOG("inet_ntop() failed (%s)", strerror(errno)); 
       return NULL; 
      } 

      return ip; 
     } 
    } 

    return NULL; 
} 

char ip[32]; 
SYSLOG("ethernet lo ip: %s", get_ethernet_ip("lo", ip, 32)); 
SYSLOG("ethernet eth0 ip: %s", get_ethernet_ip("eth0", ip, 32)); 

結果:
[を2016- 10-26 04:37:52 UTC] [server_info.cpp:90] [メイン] ethernet lo ip:1.0.0.0質問2.0.0.0


IP loために127.0.0.1なければならない0 [2016年10月26日午前4時37分52秒UTC] [server_info.cpp:91] [メイン]イーサネットのeth0 IP eth0については、それは2.0.0.0であってはなりません、そうですか?

+0

私は 'freeifaddrs()'を呼び出さなかったことを知っています。指摘する必要はありません。 – CharlesLiuChina

+0

"ip"の定義を少なくとも表示して、わかりやすく理解してください。 – paddy

+0

@paddyが再編集されました。 :-) – CharlesLiuChina

答えて

0

名前の最初のエントリはAF_INETファミリーになりますが、チェックしなかったとします。

ips->ifa_addr->sa_familyを使用してAF_INETであることを確認してください。

最初に表示されるloeth0デバイスはAF_PACKETファミリになります。

+0

それはうまくいった。ありがとうございました! :-) – CharlesLiuChina

関連する問題