Айпи адрес? - какао
Как бы я сделал программу с графическим интерфейсом, которая отображает ваш IP-адрес одним нажатием кнопки? Пожалуйста, никаких сложных объяснений, я только недавно начал какао.
Спасибо,
Kevin
5 ответов
Вы можете получить 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;
}
Для определения IP-адреса я нашел это.
Что касается превращения его в приложение Какао, добавьте NSTextField
(метка) в главное окно в Интерфейсном Разработчике, вставьте кнопку, добавьте контроллер приложения (подкласс NSObject
что вы делаете), положить в розетку и действие, сделать соответствующие соединения, и в методе "получить IP", вставьте этот код и установите значение для метки stringValue
,
Ты можешь использовать [[NSHost currentHost] address]
, но это не всегда будет отображать то, что вам нравится. Например, в моей системе он дает мой IPv6-адрес.
РЕДАКТИРОВАТЬ: В моей системе, [[[NSHost currentHost] addresses] objectAtIndex:0]
имеет мой адрес IPv4.
[[NSHost currentHost] addresses]
Вы получите массив IP-адресов. Прочитайте документацию для NSHost.
Что касается отображения этого в графическом интерфейсе, я рекомендую получить книгу Аарона Хиллегаса "Программирование какао для Mac OS X" или любую книгу для начинающих "Какао".
Я только что написал это, возможно, нужно немного поработать, но, похоже, хорошо работает на моей машине...
- (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 @"?.?.?.?";
}
Мы можем использовать 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.";
}
Таким образом, это решит все проблемы, упомянутые в комментариях к другим ответам. Кроме того, это работает значительно быстрее, чем упомянутое здесь другое решение.