2011-07-14 18 views
0

私はasyncsocketフレームワークを使用してIPアドレスを取得しようとします。それはイーサネットケーブルを介して行うときは、以下の方法がうまくいきます。 しかし、Wi-Fiアクセスポイントを使ってIPアドレスを取得しようとすると、nilが返されます。ここでWifiアドレス問題を取得する

はメソッドです:私たちが持っていた

- (NSData *)wifiAddress 

{// iPhoneには、無線LAN常に "en0の"

NSData *result = nil; 

struct ifaddrs *addrs; 
const struct ifaddrs *cursor; 

if ((getifaddrs(&addrs) == 0)) 
{ 
    cursor = addrs; 
    while (cursor != NULL) 
    { 
     NSLog(@"cursor->ifa_name = %s", cursor->ifa_name); 

     if (strcmp(cursor->ifa_name, "en0") == 0) 
     { 
      if (cursor->ifa_addr->sa_family == AF_INET) 
      { 
       struct sockaddr_in *addr = (struct sockaddr_in *)cursor->ifa_addr; 
       NSLog(@"cursor->ifa_addr = %s", inet_ntoa(addr->sin_addr)); 

       result = [NSData dataWithBytes:addr length:sizeof(struct sockaddr_in)]; 
       cursor = NULL; 
      } 
      else 
      { 
       cursor = cursor->ifa_next; 
      } 
     } 
     else 
     { 
      cursor = cursor->ifa_next; 
     } 
    } 
    freeifaddrs(addrs); 
} 

return result; 

}

答えて

1

問題が完全に一致するということでしたen0でWi-Fiアドレスが返されるとは限りません。私たちには次のようなものがあります。お役に立てれば。

NSString* wifiIp = [NetUtils getLocalAddress:@"en"]; 

+ (NSString *) getLocalAddress:(NSString*) interface 
{ 
    NSString *address = nil; 
    struct ifaddrs *interfaces = NULL; 
    struct ifaddrs *temp_addr = NULL; 
    int success = 0; 

    success = getifaddrs(&interfaces); 
    if (success == 0) 
    { 
     temp_addr = interfaces; 
     while(temp_addr != NULL) 
     { 
      if(temp_addr->ifa_addr->sa_family == AF_INET) 
      { 
       NSRange range = [[NSString stringWithUTF8String:temp_addr->ifa_name] rangeOfString : interface]; 

       if(range.location != NSNotFound) 
       { 
        address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)]; 
       } 
      } 

      temp_addr = temp_addr->ifa_next; 
     } 
    } 

    freeifaddrs(interfaces); 

    return address; 
} 
+0

(NSString *)インターフェイスパラメータには何を挿入すればよいですか? – Sergio

+0

"en"(例えばen0、en1など)を持つものはすべて捕捉されるので、単に "en"を使用します。 – tjg184

関連する問題