iOS-ping 网络小工具

8,283 阅读3分钟
原文链接: ppsheep.com

Ping工具经常在游戏中见到,计算网络的延迟,Apple官方有一个SimplePing的demo,用于对网络进行检测,就跟我们电脑端的ping效果相同,在一些情况下,我们可以用来进行网络速度的检测,这里将官方给出的demo进行封装,并且在SimplePing的基础上进行了一些改动,将我们需要用到的一些其他的数据取出来,便于我们的使用,源码我会放在文章末尾。

SimplePing

Apple官方的demo SimplePing ,能够实现网络ping功能,但是有一些其他的数据不能够得到,例如存活时间,响应时间等等,下面是官方例子:

developer.apple.com/library/con…

改动后的PPSSimplePing

改动后的SimplePing能够计算出响应时间,得到域名的ip地址,存活时间等等。

PPSPingItem

新建一个我们的自己的工程,将刚才下载的例子中的SimplePing 头文件和实现文件 两个文件拷贝到我们的工程中

首先,我们新建一个model PPSPingItem 用来封装我们在网络ping过程中,返回的一些数据,便于数据展示

我们来看一张电脑的终端ping的样式:

我们在手机端要实现的也是这种效果

PPSPingItem:

#import 
typedef NS_ENUM(NSUInteger, PPSPingStatus){
    PPSPingStatusDidStart,//开始
    PPSPingStatusDidFailToSendPacket,//发送数据包失败
    PPSPingStatusDidReceivePacket,//收到数据包
    PPSPingStatusDidReceiveUnexpectedPacket,//数据包数据错误
    PPSPingStatusDidTimeout,//超时
    PPSPingStatusError,//错误
    PPSPingStatusFinished,//完成
};
@interface PPSPingItem : NSObject
/**
 
 ping www.163.com
 
 PING 163.xdwscache.ourglb0.com (183.134.24.71): 56 data bytes
 
 64 bytes from 183.134.24.71: icmp_seq=0 ttl=53 time=12.914 ms
 64 bytes from 183.134.24.71: icmp_seq=1 ttl=53 time=15.136 ms
 
 --- 163.xdwscache.ourglb0.com ping statistics ---
 2 packets transmitted, 2 packets received, 0.0% packet loss
 
 */
/**
 对应上面的一个ping解释属性
 */
@property(nonatomic) NSString *originalAddress; // 163.xdwscache.ourglb0.com
@property(nonatomic, copy) NSString *IPAddress;// 183.134.24.71
@property(nonatomic) NSUInteger dateBytesLength;// 64
@property(nonatomic) double     timeMilliseconds;//time
@property(nonatomic) NSInteger  timeToLive;//ttl
@property(nonatomic) NSInteger  ICMPSequence;//icmp_seq
@property(nonatomic) PPSPingStatus status;
@end

PPSPingItem中的属性,在我们ping网络过程中,返回数据时需要用到。

PPSPingServices

PPSPingServices是一个服务类,用作ping的入口,一个管理类,供外部调用,在PPSPingServices类中,我将发起网络ping的接口做成了block,当然,如果你更喜欢delegate,也可以使用delegate实现

首先,一个类方法,调起Ping服务

/**
 开始收集Ping网络消息
 
 @param address 域名
 @param handler 回调包信息 每次收到的网络信息
 @return PPSPingServices
 */
+ (PPSPingServices *)startPingAddress:(NSString *)address
                      callbackHandler:(void(^)(PPSPingItem *pingItem, NSArray *pingItems))handler;

在实现文件中,我们需要实现SimplePingDelegate,delegate中一共有6个方法,分别对应这ping的不同状态

//开始进行网络检测
- (void)simplePing:(SimplePing *)pinger didStartWithAddress:(NSData *)address;
//网络检测失败
- (void)simplePing:(SimplePing *)pinger didFailWithError:(NSError *)error;
//发送网络包成功
- (void)simplePing:(SimplePing *)pinger didSendPacket:(NSData *)packet sequenceNumber:(uint16_t)sequenceNumber;
//发送网络包失败
- (void)simplePing:(SimplePing *)pinger didFailToSendPacket:(NSData *)packet sequenceNumber:(uint16_t)sequenceNumber error:(NSError *)error;
//收到网络包回应
- (void)simplePing:(SimplePing *)pinger didReceivePingResponsePacket:(NSData *)packet sequenceNumber:(uint16_t)sequenceNumber;
//收到错误的网络包
- (void)simplePing:(SimplePing *)pinger didReceiveUnexpectedPacket:(NSData *)packet;

开始ping网络数据:

/**
 开始网络ping网络
 @param sender 按钮
 */
- (IBAction)startPing:(id)sender {
 self.pingService = [PPSPingServices startPingAddress:_domainTextFiled.text callbackHandler:^(PPSPingItem *pingItem, NSArray *pingItems) {
     NSLog(@"%@",pingItem);
 }];
}

在服务类中,我们开始ping网络,会在6个delegate方法中,分别获得ping网络的返回值

看一下效果图:

后面如果还有时间,会接着完善

源码放在:

github.com/yangqian111…

ppsheep wechat

欢迎您扫一扫上面的微信公众号,我将同步发送博客内容!