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
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.
Nasıl bir ekran görüntüsü almak için p...
Program aracılığıyla ekran genişliği?N...
Nasıl üste düzenini göstermek için ben...
Nasıl python.exe konumu Program aracıl...
Benim C sunucusunun IP adresini almak ...