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];
}
我正在使用 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];
}