Айпи адрес? - какао - PullRequest
       20

Айпи адрес? - какао

4 голосов
/ 26 августа 2009

Как мне создать программу с графическим интерфейсом, которая отображает ваш IP-адрес одним нажатием кнопки? Пожалуйста, никаких сложных объяснений, я только недавно начал какао.

Спасибо

Kevin

Ответы [ 5 ]

8 голосов
/ 09 ноября 2012

Вы можете получить IP-адрес двумя способами:

1 - если вы хотите получить локальный IP-адрес в текущей используемой сети, вы можете использовать следующий метод для его извлечения:

-(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;
}
7 голосов
/ 26 августа 2009

Для определения IP-адреса я нашел это .

Что касается превращения его в приложение Какао, добавьте NSTextField (метку) в главное окно в Интерфейсном Разработчике, вставьте кнопку, добавьте контроллер приложения (подкласс NSObject, который вы делаете), вставьте в розетку и действие, выполните соответствующие соединения, и в методе «get IP» вставьте этот код и установите значение для метки stringValue.

Вы можете использовать [[NSHost currentHost] address], но это не всегда будет отображать то, что вам нравится. Например, в моей системе он дает мой IPv6-адрес.

РЕДАКТИРОВАТЬ: В моей системе [[[NSHost currentHost] addresses] objectAtIndex:0] имеет мой адрес IPv4.

4 голосов
/ 17 декабря 2014

Я только что написал это, возможно, нужно немного поработать, но, похоже, хорошо работает на моей машине ...

- (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 @"?.?.?.?";
}
4 голосов
/ 26 августа 2009

[[NSHost currentHost] addresses] даст вам массив IP-адресов. Прочитайте документацию для NSHost .

Что касается отображения этого в графическом интерфейсе, я рекомендую приобрести книгу Аарона Хиллегаса «Программирование какао для Mac OS X» или любую книгу для начинающих «Какао».

1 голос
/ 12 августа 2017

Мы можем использовать 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.";
}

Итак, это решит все проблемы, упомянутые в комментариях к другим ответам. Кроме того, это работает значительно быстрее, чем упомянутое здесь другое решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...