iOS SimplePing委托

时间:2015-07-19 22:07:03

标签: ios objective-c delegates network-programming

我正在使用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无法访问主机?

1 个答案:

答案 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];
}