¿Cómo podría hacer un programa con interfaz que muestra su dirección Ip con un clic de un botón? Por favor, no difícil explicaciones, acabo de empezar el Cacao no hace mucho tiempo.

Gracias,

Kevin

  • Él quiere hacerlo en un Mac, donde él no tiene VB.
  • Sí que me he hecho el IP de la cosa en Visual Basic, pero quiero intentar hacerlo en el Cacao
  • déjame que para usted… youtube.com/watch?v=hkDD03yeLnU
InformationsquelleAutor lab12 | 2009-08-26

5 Comentarios

  1. 9

    Usted puede obtener la dirección IP a través de dos formas:

    1 – si usted desea obtener la dirección ip local de la corriente utilizada red, puede utilizar el siguiente método para obtener de él:

    -(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 – si usted desea obtener la dirección IP externa, entonces usted necesita utilizar el siguiente método:

    -(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;
    }
    • Usted sólo debe llamar freeifaddrs() si getifaddrs() éxito.
  2. 7

    Para la determinación de la dirección IP, la he encontrado
    este.

    Como para que lo que en un Cacao de la aplicación, añadir un NSTextField (etiqueta) a la ventana principal en el Interface Builder, poner en un botón, añadir un controlador de aplicación (una subclase de NSObject que hacer), poner en la toma de corriente y de la acción, hacer lo correcto conexiones, y en el «get IP» método, poner en el código y establecer el valor de la etiqueta de la stringValue.

    Puede utilizar [[NSHost currentHost] address], pero no siempre mostrar lo que te gusta. En mi sistema, por ejemplo, mi dirección IPv6.

    EDITAR: En mi sistema, [[[NSHost currentHost] addresses] objectAtIndex:0] tiene mi dirección IPv4.

    • para mí no es el primer objeto, que es el último. También, en lugar de utilizar objectAtIndex, recomiendo «lastObject»: [[[NSHost currentHost] direcciones] lastObject]
    • Para mí es el segundo índice de 5. Tal vez algunos de validación es necesario si usted está buscando específicamente un IPv4 o IPv6 dirección.
  3. 4

    [[NSHost currentHost] addresses] obtendrá una matriz de IPs. Leer el documentación para NSHost.

    Para mostrar que en una interfaz gráfica de usuario, recomiendo conseguir Aaron Hillegass’ libro de Cacao de Programación para Mac OS X, o cualquier Cacao principiantes libro debe enseñar que.

    • Es NSHost consistente en la ordenación de las direcciones? He leído que algunas personas dicen que no, pero que estaba hablando simplemente de la dirección, no direcciones. Nunca he tenido ocasión de utilizar NSHost.
    • Así, una matriz no mantener el orden, frente a un diccionario.. yo realmente no podía decir de qué tan confiable es aunque.
    • Bien. A lo que me refería era, lo hace siempre ir IPv6, IPv4, local de enlace IPv4 de bucle, bucle invertido de IPv6?
    • Hmm.. parece como si usted tiene IPv6 habilitado, se mostrará que la primera, luego de IPv4. De lo contrario, creo que sigue la secuencia de las preferencias del sistema -> interfaces de red de la lista.
    • Respuesta incompleta.
  4. 4

    Acabo de escribir esto, puede necesitar un poco de trabajo pero parece que funciona bien en mi máquina…

    - (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 @"?.?.?.?";
    }
    • Funcionó bien para mí!!!
  5. 1

    Podemos utilizar hostWithName: método con el nombre del host actual. Esto devolverá un solo local IPv4 y IPv6 IP, que podemos filtrar fácilmente.

    Podemos conseguir que el actual sistema de nombre de host mediante [[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.";
    }

    Así, esto va a resolver todos los problemas que se menciona en los comentarios de otras respuestas. También, de esta manera, el trabajo más rápido que el resto de la solución de mencionar aquí.

Dejar respuesta

Please enter your comment!
Please enter your name here