7.制作的ping库
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;
- 方法执行失败,返回错误信息
- (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 使用
整体代码
细分代码
我们根据流程图,一步一步编写代码
1.定义pinger
@property (nonatomic, strong) SimplePing *pinger;
- 初始化 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{}
更多内容继续更新.