我正在使用SimplePing扫描我的局域网。 我正在尝试ping我的网络上的所有可用IP,所以我在第一个主机之前触发ping,然后代表再次为下一个主机启动ping。 这里的问题是,当主机无法访问时,没有代理正在解雇。 我使用以下代表:
- (void)simplePing:(SimplePing *)pinger didStartWithAddress:(NSData *)address;
- (void)simplePing:(SimplePing *)pinger didFailWithError:(NSError *)error;
- (void)simplePing:(SimplePing *)pinger didSendPacket:(NSData *)packet;
- (void)simplePing:(SimplePing *)pinger didFailToSendPacket:(NSData *)packet error:(NSError *)error;
- (void)simplePing:(SimplePing *)pinger didReceivePingResponsePacket:(NSData *)packet;
- (void)simplePing:(SimplePing *)pinger didReceiveUnexpectedPacket:(NSData *)packet;
因此,如果成功,didReceivePingPacket
将触发下一个ping但是如果失败则不会激活上述代表。
我尝试减少ping超时,以便使用this触发didFailWithError委托,但似乎无效。 所以我的问题是:有没有办法知道何时使用SimplePing无法访问主机?
答案 0 :(得分:2)
您提供的链接未设置" ping超时",它设置发送超时。在这种情况下,ping超时并不存在,我担心,因为网络操作成功完成,你只是没有得到回复。您必须自己检查此超时情况。
我这样做的方式是发送数据包(在didSendPacket:
方法中),启动NSTimer。如果在计时器用完之前执行方法didReceivePingResponsePacket:
,ping显然会返回并且您可以使计时器无效;但是,如果您的计时器在收到响应数据包之前触发,您应该假设" ping超时"发生。
在代码中,它看起来像这样(我正在写这个,所以......仔细检查语法,将变量和方法放在适当的位置,......代码应该证明原理,虽然):
const PING_TIMEOUT = 1.0f
pingTimer: NSTimer = nil;
- (void)pingNextHost {
// set up the next host IP address, whatever needs to be done
simplePing.sendPingWithData:(<some NSData>);
}
- (void)simplePing:(SimplePing *)pinger didSendPacket:(NSData *)packet {
pingTimer = [NSTimer scheduledTimerWithTimeInterval:PING_TIMEOUT target:self selector:@selector(timerFired:) userInfo:nil repeats:NO];
}
- (void)simplePing:(SimplePing *)pinger didReceivePingResponsePacket:(NSData *)packet {
NSLog(@"got response packet, host reachable");
// Invalidate timer
[pingTimer invalidate];
// Move to next host
[self pingNextHost];
}
- (void):timerFired(NSTimer *)timer {
NSLog(@"ping timeout occurred, host not reachable");
// Move to next host
[self pingNextHost];
}