ボタンをクリックしてIPアドレスを表示するGUIプログラムを作るにはどうすればよいですか?してください、難しい説明は、私はちょうどココアを始めたことはありません。 IPアドレスを決定するためIPアドレス? - ココア
おかげで、
ボタンをクリックしてIPアドレスを表示するGUIプログラムを作るにはどうすればよいですか?してください、難しい説明は、私はちょうどココアを始めたことはありません。 IPアドレスを決定するためIPアドレス? - ココア
おかげで、
ケビンは、私が thisを見つけました。
これをCocoaアプリケーションにするには、Interface BuilderのメインウィンドウにNSTextField
(ラベル)を追加し、ボタンを押してアプリケーションコントローラ(あなたが作成したサブクラスのNSObject
)を追加し、適切な接続を行い、「get IP」メソッドでそのコードを入力し、ラベルのstringValue
の値を設定します。
[[NSHost currentHost] address]
を使用できますが、いつも好きなものが表示されるわけではありません。私のシステムでは、例えば、私のIPv6アドレスが与えられます。
EDIT:私のシステムでは、[[[NSHost currentHost] addresses] objectAtIndex:0]
に私のIPv4アドレスがあります。
私のためです最初のオブジェクトではなく、最後のオブジェクトです。また、objectAtIndexを使用するのではなく、私は "lastObject"を提案します:[[[NSHost currentHost] addresses] lastObject] – auco
私には5のうち2番目のインデックスです。IPv4やIPv6住所。 –
[[NSHost currentHost] addresses]
は、IPの配列を取得します。 documentation for NSHostを読んでください。
これをGUIで表示するには、Aaron Hillegassの書籍「Cocoa Programming for Mac OS X」を入手するか、ココア初心者の本で教えてください。
次の2つの方法を介してIPアドレスを取得することができます:あなたが現在使用netwrok上のローカルIPアドレスを取得したい場合、あなたはそれをretriveするには、次の方法を使用することができます
の1-:
-(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;
}
'getifaddrs()'が成功した場合にのみ 'freeifaddrs()'を呼び出すべきです。 –
を私は、これを書いたいくつかの作業を必要とするかもしれないが、私のマシン上でうまく動作するようです...
- (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.";
}
だから、これはすべての問題を解決する他の回答のコメントで言及されます。また、これはここで言及された他の解決策よりも著しく速く働く。
彼はこれをMacでやっています。そこにはVBがありません。 – Cinder6
さて、私はVisual BasicでIPのことをやったことがありますが、私はココアでそれをやろうとしています – lab12
あなたのためにそれを手放させてください... http://www.youtube.com/watch?v=hkDD03yeLnU – z8000