7.制作的ping库

2019-10-23  本文已影响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地址的字符串形式.

只读,保存由初始化方法initWithHostName:传入的ping操作连接的主机域名或ip地址.
当前对象的回调.
主机的ip地址类型,ipv4 ,ipv6.
typedef NS_ENUM(NSInteger, SimplePingAddressStyle) {
    SimplePingAddressStyleAny,        
    SimplePingAddressStyleICMPv4,
    SimplePingAddressStyleICMPv6   
};
只读,在start方法调用之后,根据hostName得到的要ping的主机的ip地址.
只读,hostAddress的地址族,如果hostAddress为nil,则其值为:AF_UNSPEC.
只读,当创建一个SimplePing实例对象时,会自动生成一个随机的标识符,用来唯一标识当前ping对象.
只读,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 使用.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{}

更多内容继续更新.

上一篇下一篇

猜你喜欢

热点阅读