2009-08-26 7 views
3

ボタンをクリックしてIPアドレスを表示するGUIプログラムを作るにはどうすればよいですか?してください、難しい説明は、私はちょうどココアを始めたことはありません。 IPアドレスを決定するためIPアドレス? - ココア

おかげで、

+1

彼はこれをMacでやっています。そこにはVBがありません。 – Cinder6

+1

さて、私はVisual BasicでIPのことをやったことがありますが、私はココアでそれをやろうとしています – lab12

+4

あなたのためにそれを手放させてください... http://www.youtube.com/watch?v=hkDD03yeLnU – z8000

答えて

6

ケビンは、私が thisを見つけました。

これをCocoaアプリケーションにするには、Interface BuilderのメインウィンドウにNSTextField(ラベル)を追加し、ボタンを押してアプリケーションコントローラ(あなたが作成したサブクラスのNSObject)を追加し、適切な接続を行い、「get IP」メソッドでそのコードを入力し、ラベルのstringValueの値を設定します。

[[NSHost currentHost] address]を使用できますが、いつも好きなものが表示されるわけではありません。私のシステムでは、例えば、私のIPv6アドレスが与えられます。

EDIT:私のシステムでは、[[[NSHost currentHost] addresses] objectAtIndex:0]に私のIPv4アドレスがあります。

+0

私のためです最初のオブジェクトではなく、最後のオブジェクトです。また、objectAtIndexを使用するのではなく、私は "lastObject"を提案します:[[[NSHost currentHost] addresses] lastObject] – auco

+0

私には5のうち2番目のインデックスです。IPv4やIPv6住所。 –

4

[[NSHost currentHost] addresses]は、IPの配列を取得します。 documentation for NSHostを読んでください。

これをGUIで表示するには、Aaron Hillegassの書籍「Cocoa Programming for Mac OS X」を入手するか、ココア初心者の本で教えてください。

+0

NSHostはアドレスの順序が一致していますか?私は、そうではないと言っている人をいくつか読んだが、それは単にアドレスではなくアドレスであることを話していた。私はNSHostを使う機会を一度も持っていません。 – Cinder6

+0

さて、配列は順序を維持しています、辞書との比較。私は本当にどのように信頼性が高いと言うことはできませんでした。 –

+0

私が意味していたことは、常にIPv6、IPv4、リンクローカル、IPv4ループバック、IPv6ループバックになるのですか? – Cinder6

8

次の2つの方法を介してIPアドレスを取得することができます:あなたが現在使用netwrok上のローカルIPアドレスを取得したい場合、あなたはそれをretriveするには、次の方法を使用することができます

の1-:

-(NSString *)getIPAddress 
{ 
    NSString *address = @"error"; 
    struct ifaddrs *interfaces = NULL; 
    struct ifaddrs *temp_addr = NULL; 
    int success = 0; 

    // retrieve the current interfaces - returns 0 on success 
    success = getifaddrs(&interfaces); 
    if (success == 0) 
    { 
     // Loop through linked list of interfaces 
     temp_addr = interfaces; 
     while(temp_addr != NULL) 
     { 
      if(temp_addr->ifa_addr->sa_family == AF_INET) 
      { 
        // Get NSString from C String 
        address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)]; 
      } 
      temp_addr = temp_addr->ifa_next; 
     } 
    } 

    // Free memory 
    freeifaddrs(interfaces); 
    return address; 
} 

2 - あなたは、外部IPアドレスを取得したい場合、あなたは以下の方法を使用する必要があります。

-(NSString*)getIP 
{ 
    NSUInteger an_Integer; 
    NSArray * ipItemsArray; 
    NSString *externalIP; 

    NSURL *iPURL = [NSURL URLWithString:@"http://www.dyndns.org/cgi-bin/check_ip.cgi"]; 

    if (iPURL) { 
     NSError *error = nil; 
     NSString *theIpHtml = [NSString stringWithContentsOfURL:iPURL encoding:NSUTF8StringEncoding error:&error]; 
     if (!error) { 
      NSScanner *theScanner; 
      NSString *text = nil; 

      theScanner = [NSScanner scannerWithString:theIpHtml]; 

      while ([theScanner isAtEnd] == NO) { 

       // find start of tag 
       [theScanner scanUpToString:@"<" intoString:NULL] ; 

       // find end of tag 
       [theScanner scanUpToString:@">" intoString:&text] ; 

       // replace the found tag with a space 
       //(you can filter multi-spaces out later if you wish) 
       theIpHtml = [theIpHtml stringByReplacingOccurrencesOfString: 
          [ NSString stringWithFormat:@"%@>", text] 
                   withString:@" "] ; 
       ipItemsArray =[theIpHtml componentsSeparatedByString:@" "]; 
       an_Integer=[ipItemsArray indexOfObject:@"Address:"]; 
       externalIP =[ipItemsArray objectAtIndex: ++an_Integer]; 
      } 
      NSLog(@"%@",externalIP); 
     } else { 
      NSLog(@"Oops... g %d, %@", [error code], [error localizedDescription]); 
     } 
    } 
    return externalIP; 
} 
+0

'getifaddrs()'が成功した場合にのみ 'freeifaddrs()'を呼び出すべきです。 –

3

を私は、これを書いたいくつかの作業を必要とするかもしれないが、私のマシン上でうまく動作するようです...

- (NSString *)getLocalIPAddress 
{ 
    NSArray *ipAddresses = [[NSHost currentHost] addresses]; 
    NSArray *sortedIPAddresses = [ipAddresses sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 

    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init]; 
    numberFormatter.allowsFloats = NO; 

    for (NSString *potentialIPAddress in sortedIPAddresses) 
    { 
     if ([potentialIPAddress isEqualToString:@"127.0.0.1"]) { 
      continue; 
     } 

     NSArray *ipParts = [potentialIPAddress componentsSeparatedByString:@"."]; 

     BOOL isMatch = YES; 

     for (NSString *ipPart in ipParts) { 
      if (![numberFormatter numberFromString:ipPart]) { 
       isMatch = NO; 
       break; 
      } 
     } 
     if (isMatch) { 
      return potentialIPAddress; 
     } 
    } 

    // No IP found 
    return @"?.?.?.?"; 
} 
+1

私のためにうまくいった! –

0

hostWithName:メソッドを現在のホスト名で使用できます。これにより、簡単にフィルタリングできる単一のローカルIPv4およびIPv6 IPだけが返されます。

[[NSHost currentHost] name]を使用して現在のシステムホスト名を取得できます。

+(NSString *)getLocalIPAddress{ 
    NSArray *ipAddresses = [[NSHost hostWithName:[[NSHost currentHost] name]] addresses]; 
    for (NSString *ipAddress in ipAddresses) { 
     if ([ipAddress componentsSeparatedByString:@"."].count == 4) { 
      return ipAddress; 
     } 
    } 
    return @"Not Connected."; 
} 

だから、これはすべての問題を解決する他の回答のコメントで言及されます。また、これはここで言及された他の解決策よりも著しく速く働く。