从iPhone ping到服务器端口?

时间:2010-12-29 10:08:49

标签: iphone objective-c

如何从Objective C(iphone)ping服务器端口?..

3 个答案:

答案 0 :(得分:2)

首先你应该看看这个问题

How to write a simple Ping method in Cocoa/Objective-C

然后

C Sockets Ping Command?

http://en.wikipedia.org/wiki/Internet_Control_Message_Protocol

http://www.kernelthread.com/projects/hanoi/html/icmp.html

http://www.programmersheaven.com/download/2417/download.aspx

我找到了这段代码..

How to write a simple Ping method in Cocoa/Objective-C

    * Start
    * Kontakt

How to write a simple Ping method in Cocoa/Objective-C

Question: How to write a simple Ping method in Cocoa/Objective-C
I need to write a simple ping method in Cocoa/Objective-C. It also needs to work on the iPhone. I found an example that uses icmp , will this work on the iPhone? I'm leaning towards a solution using NSNetServices , is this a good idea? The method only needs to ping a few times and return the average and -1 if the host is down or unreachable.
avatar rjstelling

Autor: rjstelling
Utworzono: 28 Apr 2009
Language: question language en
Answers:
1.  The code below seems to be working synchronously: const char *hostName = [@"stackoverflow.com" cStringUsingEncoding:NSASCIIStringEncoding]; SCNetworkConnectionFlags flags = 0; if (SCNetworkCheckReachabilityByName(hostName, &flags) && flags > 0) { NSLog(@"Host is reachable: %d", flags); } else { NSLog(@"Host is unreachable"); } Note: SystemConfiguration.framework is required
2.  Let me try this again...this time logging in, and formatting better ;-) StreamSCNetworkCheckReachabilityByName is deprecated and NOT available for the iPhone. bool success = false; const char *host_name = [@"stackoverflow.com" cStringUsingEncoding:NSASCIIStringEncoding]; SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, host_name); SCNetworkReachabilityFlags flags; success = SCNetworkReachabilityGetFlags(reachability, &flags); bool isAvailable = success && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired); if (isAvailable) { NSLog(@"Host is reachable: %d", flags); }else{ NSLog(@"Host is unreachable"); } Note: SystemConfiguration.framework is required
3.  Look into CFHost and in particular CFHostGetReachability . There is sample CFHost code available, as well, which includes a routine to check host availability.
4.  You are not missing anything -- "Reachability" doesn't actually test that the target domain is in fact reachable, it only assesses if there is a pathway out of the machine by which the target domain is potentially reachable. So long as you have some outbound connection (e.g., an active wirless or wired connection), and a routing configuration that leads to the target, then the site is "reachable" as far as SCNetworkReachability is concerned.
5.  i tested with IP address but it not works properly: result is always YES! is it possibile that do not exist a simple echo with timeout class?
6.  Hi, Please take note that there is an difference between the simulator and the actual iPhone. The simulator is not a true simulator like the one supplied by Android, it uses Mac OSX classes for most of the functions. This is particularly hell if there is a difference between the Mac OSX and iPhonew(for example the keychain).
7.  The answer Gene Myers posted works using "SCNetworkReachabilityCreateWithName" for me - but only in the simulator. On my device (iPod w/OS 2.2.1) it always returns "Host is reachable" even for nonsense addresses like "zzz". Am I misunderstanding something? Thanks. Here's my code just in case: From https://stackoverflow.com/questions/798454/how-to-write-a-simple-ping-method-in-cocoa-objective-c - (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]]; } }
8.  Pinging on the iPhone works a bit different than on other platforms, due to the fact that you don't have root access. See this sample code from Apple.

答案 1 :(得分:1)

简单回答..

使用适用于MAc OS的SimplePing程序..

将CFNetwork FrameWork for MAC替换为iPhone CFNetwork FrameWork .....

运行程序......

请记住,将项目作为iPhone启动,然后复制SimplePing.h和.m并在视图控制器中复制MAin代码....

将main.m(下面)中的这个main函数替换为(bootom code StartPinging)

enter code here

int main(int argc, char* argv[])
{
    #pragma unused(argc)
    #pragma unused(argv)
    NSAutoreleasePool * pool;
    Main *              mainObj;

    pool = [[NSAutoreleasePool alloc] init];
    assert(pool != nil);

    if (argc == 2) {
        mainObj = [[[Main alloc] init] autorelease];
        assert(mainObj != nil);

        [mainObj runWithHostName:[NSString stringWithUTF8String:"www.google.com"]];
    } else {
       fprintf(stderr, "usage: %s host\n", getprogname());
    }

    [pool drain];

    // On success we loop forever in -runWithHostName:, so the only way to 
    // get here is if something went wrong.

    return EXIT_FAILURE;
}

-(void) startPinging
{

    NSAutoreleasePool * pool;
    Main *              mainObj;

    pool = [[NSAutoreleasePool alloc] init];
    assert(pool != nil);


        mainObj = [[[Main alloc] init] autorelease];
        assert(mainObj != nil);

        [mainObj runWithHostName:[NSString stringWithUTF8String:"www.google.com"]];
  }

    [pool drain];

    // On success we loop forever in -runWithHostName:, so the only way to 
    // get here is if something went wrong.


}

将此启动方法连接到Button ..

答案 2 :(得分:0)

我遇到了同样的问题,最后围绕SimplePing写了一个简单的包装器来实现这个目的,写了一篇关于它的博客,github上有一些代码,希望能帮到这里的人:

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