Sanal MS
Sanal MS

Reputation: 2504

ping to a server port from iPhone?

How can i ping to a server port from Objective C (iphone)?..

Upvotes: 1

Views: 6349

Answers (3)

Soner Gönül
Soner Gönül

Reputation: 98750

Firstly you shoud look this question

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

and then

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

And i found this code..

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.

Upvotes: 2

Chris
Chris

Reputation: 40623

I had this same problem, and ended up writing a simple wrapper around SimplePing to achieve this, wrote a blog about it and there's some code on github, hopefully will help someone here:

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

Upvotes: 0

user991669
user991669

Reputation: 11

Simple Answer ..

USE the SimplePing Programme For MAc OS ..

Replace the CFNetwork FrameWork for MAC in that to iPhone CFNetwork FrameWork .....

And Run the Programme....

Remember , Start The Project as iPhone , then Copy SimplePing.h and .m And Copy the Codes of MAin in your View Controller ....

Replace This main function in main.m(below) to (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.


}

Connect this startpinging method to your Button..

Upvotes: 1

Related Questions