如何从Objective C(iphone)ping服务器端口?..
答案 0 :(得分:2)
首先你应该看看这个问题
How to write a simple Ping method in Cocoa/Objective-C
然后
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