iOS SimplePing 代表

iOS SimplePing delegates

我正在使用 SimplePing 扫描我的 LAN。 我正在尝试 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 无法访问主机?

您提供的 link 没有设置 "ping timeout",它设置了发送超时。恐怕在这种情况下不存在 ping 超时,因为网络操作已成功完成,您只是没有得到响应。您必须自己检查此超时条件。

我会这样做的方法是当你发送一个数据包时(在 didSendPacket: 方法中),启动一个 NSTimer。如果方法 didReceivePingResponsePacket: 在计时器用完之前执行,则 ping 显然执行 return 并且您可以使计时器无效;但是,如果您的计时器在您收到响应数据包之前触发,您应该假设发生了 "ping timeout"。

在代码中它看起来像这样(我是凭空写的,所以...仔细检查语法,将变量和方法放在适当的位置,...代码应该展示原理, 不过):

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