美文网首页
7.制作的ping库

7.制作的ping库

作者: 木子心语 | 来源:发表于2019-10-23 09:36 被阅读0次

    1.ping 是什么?

    ping(网络诊断工具),用于测试网络连接量的程序.利用ping命令可以检查网络的是否连通,可以很好地帮助我们分析和判断网络故障.

    2.怎么使用ping

    比如ping百度

    ping www.baidu.com
    
    ping www.baidu.com.png
    ping+空格+你需要访问的网址或者ip.
    

    操作起来很简单,其实用ping命令除了验证自己的网络段是否通,还有另一个作用,就是查看延迟和丢包.
    上图中的time就是延迟时间,可以看到访问百度,最小5ms.时间越小越好,说明你可以访问这些网络地址耗费少的时间.

    3.最近迷上ping这个词

    最近迷上了ping,短时间内离不开它.
    最近项目需要,需要了解它的一切,不知不觉已经迷上了它.
    因为项目中含有网络通信,要进行ping计算,来检测网络的连通以及网络的延迟,丢包.能够及时调整网络段,可以让使用者更方便的使用,爱上我们的项目.

    4.ping库来源

    手机网络连接状态的检查对于iOS App开发是一个非常基础的需求.幸运的是,苹果为我们提供了示例源码:SimPing
    地址:

    https://developer.apple.com/library/archive/samplecode/SimplePing/In
    troduction/Intro.html
    

    在iOS,MAC上如何用OC/Swift实现ping操作,我们通过ping来检查手机网络的真实连接状态.



    我们可以通过SimplePing这个类,进一步了解官方ping.
    我们直接把这个类拷贝出来,粘贴到自己的项目中.


    我们进一步了解SimplePing的结构

    SimplePing 结构.png

    接口很清晰给我们介绍了SimplePing的初始化,回调方法,属性以及方法.

    接下来,我们根据结构图,一一介绍SimplePing类的个属性,方法以及回调方法的作用.

    • 初始化方法
    - (instancetype)initWithHostName:(NSString *)hostName 
    NS_DESIGNATED_INITIALIZER;
    

    SimplePing中,初始化一个用于ping指定的主机实例对象.
    hostName 参数可以是主机DNS域名,IPv4,IPv6地址的字符串形式.

    • 属性 -- hostName
    只读,保存由初始化方法initWithHostName:传入的ping操作连接的主机域名或ip地址.
    
    • 属性 -- delegate
    当前对象的回调.
    
    • 属性 -- addressStyle
    主机的ip地址类型,ipv4 ,ipv6.
    
    typedef NS_ENUM(NSInteger, SimplePingAddressStyle) {
        SimplePingAddressStyleAny,        
        SimplePingAddressStyleICMPv4,
        SimplePingAddressStyleICMPv6   
    };
    
    • 属性 -- hostAddress
    只读,在start方法调用之后,根据hostName得到的要ping的主机的ip地址.
    
    • 属性 -- hostAddressFamily
    只读,hostAddress的地址族,如果hostAddress为nil,则其值为:AF_UNSPEC.
    
    • 属性 -- identifier
    只读,当创建一个SimplePing实例对象时,会自动生成一个随机的标识符,用来唯一标识当前ping对象.
    
    • 属性 -- nextSequenceNumber
    只读,ping每发送一次数据包都会有一个对应的序列号.
    
    • 回调方法

    1.start 方法成功执行,可在此开始发送数据,其中address为主机的ip地址

    - (void)simplePing:(SimplePing *)pinger didStartWithAddress:(NSData *)address;
    
    1. 方法执行失败,返回错误信息
    - (void)simplePing:(SimplePing *)pinger didFailWithError:(NSError *)error;
    

    3.成功过发送 ICMP 数据包到制定主机,传回已发送的数据包及本次ping对应的序列号

    - (void)simplePing:(SimplePing *)pinger didSendPacket:(NSData *)packet sequenceNumber:(uint16_t)sequenceNumber;
    

    4.发送数据失败,并返回错误信息.

    - (void)simplePing:(SimplePing *)pinger didFailToSendPacket:(NSData *)packet sequenceNumber:(uint16_t)sequenceNumber error:(NSError *)error;
    

    5.成功接收主机回传与之前发送相匹配的ICMP数据包

    - (void)simplePing:(SimplePing *)pinger didReceivePingResponsePacket:(NSData *)packet sequenceNumber:(uint16_t)sequenceNumber;
    

    6.收到未知数据包

    - (void)simplePing:(SimplePing *)pinger didReceiveUnexpectedPacket:(NSData *)packet;
    
    • SimplePing 使用
    SimplePing 使用.png
    整体代码
    
    细分代码
    

    我们根据流程图,一步一步编写代码
    1.定义pinger

    @property (nonatomic, strong) SimplePing *pinger;
    
    1. 初始化 simplePing实例
    self.pinger = [[SimplePing alloc]initWithHostName:@"www.baidu.com"];
    

    3.pinger 代理

    self.pinger.delegate = self;
    

    4.ip地址类型

    self.pinger.addressStyle = SimplePingAddressStyleAny;
    

    5.调用start方法 开始ping

    [self.pinger start];
    

    6.代理方法-start 方法成功执行,可开始发送数据

    - (void)simplePing:(SimplePing *)pinger didStartWithAddress:(NSData *)address{
        [pinger sendPingWithData:nil];
    }
    

    7.代理方法-start 方法执行失败,返回错误信息

    - (void)simplePing:(SimplePing *)pinger didFailWithError:(NSError *)error{
        NSLog(@"%@", error.localizedDescription);
    }
    

    8.成功发送数据

    - (void)simplePing:(SimplePing *)pinger didSendPacket:(NSData *)packet sequenceNumber:(uint16_t)sequenceNumber{
    }
    

    9.发送数据失败

    - (void)simplePing:(SimplePing *)pinger didFailToSendPacket:(NSData *)packet sequenceNumber:(uint16_t)sequenceNumber error:(NSError *)error {}
    

    10.成功接收到响应数据

    - (void)simplePing:(SimplePing *)pinger didReceivePingResponsePacket:(NSData *)packet sequenceNumber:(uint16_t)sequenceNumber{}
    

    11.接收到未知的数据

    - (void)simplePing:(SimplePing *)pinger didReceiveUnexpectedPacket:(NSData *)packet{}
    

    更多内容继续更新.

    相关文章

      网友评论

          本文标题:7.制作的ping库

          本文链接:https://www.haomeiwen.com/subject/tbplbftx.html