SORU
16 AĞUSTOS 2011, Salı


iPhone/iPad/): Nasıl benim IP adresi Program aracılığıyla almak için?

Benim iPad IP adresi Program aracılığıyla elde etmek istiyorum. Nasıl (ve IPv6 IPv4 benim adresleri bulmak için, ağ alt sistemi sorgulayabilir miyim?

Teşekkürler. PS: devre dışı IPv6 bir şekilde Alabilir miyim?

CEVAP
29 Mayıs 2012, Salı


LÜTFEN BU KODU KULLANMADAN ÖNCE BU NOTU OKUYUN: Bazı kişi test kodumu VPN desteği eklemek için düzenlenebilir. Belki, belki bu kod işlevselliğini etkilemez, bilmiyorum çalışıyor. Düzenleme sonunda birisi kabul etmeden önce birkaç kişi tarafından reddedildi. Değişiklikleri yapan geliştirici ile iletişime geçmedim, ve önceki değişiklikleri reddeden editörler değişikliği bir yorum olarak sunulmuştur gerektiğini söyledi. Çok dikkatli devam. Eğer kod işe görünürse iyi bir yorum eklemek ve eğer böyle birkaç yorum alırsam bu uyarı çıkaracağım.

=== Yazı orijinal, benim kodu değiştiren kişi = = = tarafından son bir açıklama ile

Aşağıdaki kodu iOS) ya da aygıt üzerindeki tüm IPv4 ve IPv6 adreslerini bulur. İlk getIPAddress yöntem eylemleri daha fazla veya daha az olarak eski kod bu cevap: tercih ya birini ya da diğerini adresini yazın ve her zaman tercih WİFİ üzerinden hücresel (belli ki değişebilir bu).

Daha da ilginci tüm adresleri bulunan bir sözlük geri dönmek, not up arabirimleri adreslerini atlama, ya da loopback ile ilgili adresleri. Bu konuyla ilgili olarak kod diğer önceki çözümleri düzgün IPv6 (inet_ntoa olamaz onlarla anlaşma) çözmek. Bu işaret bana göre Jens Alfke Elma forum - düzgün işlev için kullanmak inet_ntop (man sayfası ve Bakın bu inet_ntop makalede ayrıca, tarafından sağlanan Jens.

Sözlük anahtarları formu arayüzü "" "" "veya". ıpv4 ıpv6 /

#include <ifaddrs.h>
#include <arpa/inet.h>
#include <net/if.h>

#define IOS_CELLULAR    @"pdp_ip0"
#define IOS_WIFI        @"en0"
#define IOS_VPN         @"utun0"
#define IP_ADDR_IPv4    @"ipv4"
#define IP_ADDR_IPv6    @"ipv6"

- (NSString *)getIPAddress:(BOOL)preferIPv4
{
    NSArray *searchArray = preferIPv4 ?
                            @[ IOS_VPN @"/" IP_ADDR_IPv4, IOS_VPN @"/" IP_ADDR_IPv6, IOS_WIFI @"/" IP_ADDR_IPv4, IOS_WIFI @"/" IP_ADDR_IPv6, IOS_CELLULAR @"/" IP_ADDR_IPv4, IOS_CELLULAR @"/" IP_ADDR_IPv6 ] :
                            @[ IOS_VPN @"/" IP_ADDR_IPv6, IOS_VPN @"/" IP_ADDR_IPv4, IOS_WIFI @"/" IP_ADDR_IPv6, IOS_WIFI @"/" IP_ADDR_IPv4, IOS_CELLULAR @"/" IP_ADDR_IPv6, IOS_CELLULAR @"/" IP_ADDR_IPv4 ] ;

    NSDictionary *addresses = [self getIPAddresses];
    NSLog(@"addresses: %@", addresses);

    __block NSString *address;
    [searchArray enumerateObjectsUsingBlock:^(NSString *key, NSUInteger idx, BOOL *stop)
        {
            address = addresses[key];
            if(address) *stop = YES;
        } ];
    return address ? address : @"0.0.0.0";
}

- (NSDictionary *)getIPAddresses
{
    NSMutableDictionary *addresses = [NSMutableDictionary dictionaryWithCapacity:8];

    // retrieve the current interfaces - returns 0 on success
    struct ifaddrs *interfaces;
    if(!getifaddrs(&interfaces)) {
        // Loop through linked list of interfaces
        struct ifaddrs *interface;
        for(interface=interfaces; interface; interface=interface->ifa_next) {
            if(!(interface->ifa_flags & IFF_UP) /* || (interface->ifa_flags & IFF_LOOPBACK) */ ) {
                continue; // deeply nested code harder to read
            }
            const struct sockaddr_in *addr = (const struct sockaddr_in*)interface->ifa_addr;
            char addrBuf[ MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) ];
            if(addr && (addr->sin_family==AF_INET || addr->sin_family==AF_INET6)) {
                NSString *name = [NSString stringWithUTF8String:interface->ifa_name];
                NSString *type;
                if(addr->sin_family == AF_INET) {
                    if(inet_ntop(AF_INET, &addr->sin_addr, addrBuf, INET_ADDRSTRLEN)) {
                        type = IP_ADDR_IPv4;
                    }
                } else {
                    const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6*)interface->ifa_addr;
                    if(inet_ntop(AF_INET6, &addr6->sin6_addr, addrBuf, INET6_ADDRSTRLEN)) {
                        type = IP_ADDR_IPv6;
                    }
                }
                if(type) {
                    NSString *key = [NSString stringWithFormat:@"%@/%@", name, type];
                    addresses[key] = [NSString stringWithUTF8String:addrBuf];
                }
            }
        }
        // Free memory
        freeifaddrs(interfaces);
    }
    return [addresses count] ? addresses : nil;
}

EDİT: Kod Mayıs 16, 2014 updated (lhunath, bakın yorum tarafından işaret böcek). Geri döngü adresleri şimdi, sen testi Kendin hariç Yorumsuz kolay ama geri döndü.

DÜZENLE (bilinmeyen bir kişi tarafından): kullanıcı bir VPN (ne olursa olsun) WiFi veya Hücresel kullanır durumda, önceki kod başarısız olurdu. daha 13 Mart 2015 Geliştirilmiş: Şimdi, VPN bağlantıları ile bile çalışır. VPN bağlantıları Bu cihaz nasıl işleyeceğini çünkü WiFi ve Hücre üzerinde öncelik veriliyor. Bu bile utun0 ama test değil EĞER bir Mac üzerinde VPN bağlantısı da kullanıyor gibi Mac'ler için çalışması gerekir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Artorius FullPower

    Artorius Ful

    29 Temmuz 2007
  • Carlos Delgado

    Carlos Delga

    21 HAZİRAN 2011
  • theKGB65

    theKGB65

    24 Aralık 2007