web-dev-qa-db-ja.com

Cocoa / Objective-Cで簡単なPingメソッドを作成する方法

Cocoa/Objective-Cで簡単なpingメソッドを作成する必要があります。また、iPhoneでも動作する必要があります。

icmpを使用する例を見つけましたが、これはiPhoneで機能しますか?

私はNSNetServicesを使用した解決策に傾倒していますが、これは良い考えですか?

このメソッドは、pingを数回実行するだけで、平均を返し、ホストがダウンしているか到達不能の場合は-1を返します。

19
rjstelling

これをもう一度試してみましょう...今回はログインして、フォーマットを改善します;-)

StreamSCNetworkCheckReachabilityByNameは非推奨であり、iPhoneでは使用できません。

bool success = false;
const char *Host_name = [@"stackoverflow.com" 
                         cStringUsingEncoding:NSASCIIStringEncoding];

SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL,
                                                                        Host_name);
SCNetworkReachabilityFlags flags;
success = SCNetworkReachabilityGetFlags(reachability, &flags);

//prevents memory leak per Carlos Guzman's comment
CFRelease(reachability);

bool isAvailable = success && (flags & kSCNetworkFlagsReachable) && 
                             !(flags & kSCNetworkFlagsConnectionRequired);
if (isAvailable) {
    NSLog(@"Host is reachable: %d", flags);
}else{
    NSLog(@"Host is unreachable");
}

注:SystemConfiguration.frameworkが必要です

35
Gene Myers

私はこれと同じ問題を抱えていて、これを達成するためにSimplePingの周りに単純なラッパーを書くことになり、それについてブログを書きました。

http://splinter.com.au/how-to-ping-a-server-in-objective-c-iphone

32
Chris

何も見逃していません。「到達可能性」は、ターゲットドメインが実際に到達可能であることを実際にテストするのではなく、ターゲットドメインが到達可能になる可能性のあるマシンからの経路があるかどうかを評価するだけです。アウトバウンド接続(アクティブな無線接続や有線接続など)と、ターゲットにつながるルーティング構成がある限り、SCNetworkReachabilityに関する限り、サイトは「到達可能」です。

13
Zhami

IPhoneでのpingは、ルートアクセス権がないため、他のプラットフォームとは少し異なります。これを参照してください サンプルコード Appleから。

5
Monobono

CFHost 、特に CFHostGetReachability を調べてください。 サンプルCFHostコード も利用可能で、ホストの可用性をチェックするルーチンが含まれています。

2
Alex Reynolds

Gene Myersが投稿した回答は、「SCNetworkReachabilityCreateWithName」を使用して機能しますが、シミュレーターでのみ使用できます。私のデバイス(iPod w/OS 2.2.1)では、「zzz」のような意味のないアドレスであっても、常に「ホストは到達可能です」を返します。

私は何かを誤解していますか?ありがとう。

念のために私のコードは次のとおりです。

From Cocoa/Objective-Cで簡単なPingメソッドを作成する方法

    - (IBAction) TestReachability:(id)sender
{
    bool success = false;
    const char *Host_name = [ipAddressText.textcStringUsingEncoding:NSASCIIStringEncoding];
    NSString *imageConnectionSuccess = @"Connected.png";
    NSString *imageConnectionFailed = @"NotConnected.png";

    SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL,
                                                                                Host_name);
    SCNetworkReachabilityFlags flags;
    success = SCNetworkReachabilityGetFlags(reachability, &flags);
    bool isAvailable = success && (flags & kSCNetworkFlagsReachable) && 
        !(flags & kSCNetworkFlagsConnectionRequired);
    if (isAvailable)
    {
        NSLog([NSString stringWithFormat: @"'%s' is reachable, flags: %x", Host_name, flags]);
        [imageView setImage: [UIImage imageNamed:imageConnectionSuccess]]; 
    }
    else
    {
        NSLog([NSString stringWithFormat: @"'%s' is not reachable", Host_name]);
        [imageView setImage: [UIImage imageNamed:imageConnectionFailed]]; 
    }
}
0
Chris Bennet