iOS中ping-SimplePing的使用

前言

??手機網(wǎng)絡(luò)連接狀態(tài)的檢測對于iOS 開發(fā)來說是一個非彻饧冢基礎(chǔ)的需求坤次。為了更好的用戶體驗步鉴,我們會在無網(wǎng)絡(luò)時展現(xiàn)本地或者緩存的內(nèi)容揪胃,并對用戶進行合適的提示。對于網(wǎng)絡(luò)狀態(tài)的檢測氛琢,蘋果提供了Reachability喊递,由此也衍生出各種 Reachability 框架,比較著名的有Github上的 tonymillion/Reachability 以及 AFNetworking 中的 AFNetworkReachabilityManager 模塊阳似,它們的實現(xiàn)原理基本上是完全相同的骚勘。
??但事實上,此方案能獲取的只是設(shè)備的本地連接狀態(tài)撮奏,有時它很難為我們檢測真正的網(wǎng)絡(luò)連接狀態(tài)俏讹,如以下場景:

  • 現(xiàn)在很多的公共場所的 WiFi,需要網(wǎng)頁登錄授權(quán)畜吊,授權(quán)之前無法上網(wǎng)泽疆,但本地連接已經(jīng)建立;
  • 存在了本地網(wǎng)絡(luò)連接玲献,但信號很差殉疼,實際無法連接到服務(wù)器;
  • iOS 連接的路由設(shè)備本身沒有連接外網(wǎng)等捌年。

Ping

??pingWindows瓢娜、UnixLinuxmacOS 等系統(tǒng)下一個常用的命令礼预,利用 ping 命令可以用來測試數(shù)據(jù)包 (ICMP) 能否通過IP 協(xié)議到達特定主機眠砾,并收到主機的應(yīng)答,以檢查網(wǎng)絡(luò)是否連通和網(wǎng)絡(luò)連接速度托酸,幫助我們分析和判定網(wǎng)絡(luò)故障荠藤。
??SimplePing是蘋果封裝好的ping的功能,它利用resolve host获高,create socket(send&recv data)哈肖,解析ICMP 包驗證 checksum 等實現(xiàn)了 ping功能。并且支持iPv4iPv6念秧。

SimplePing類結(jié)構(gòu)

SimplePing.h

SimplePing的使用很簡單:

   // 1. 利用 HostName 創(chuàng)建 SimplePing
    self.simplePing = [[SimplePing alloc] initWithHostName:@"www.apple.com"];
    // 2. 指定 IP 地址類型淤井,默認是都支持
    if (isIpv4 && !isIpv6) {
        self.simplePing.addressStyle = SimplePingAddressStyleICMPv4;
    }else if (isIpv6 && !isIpv4) {
        self.simplePing.addressStyle = SimplePingAddressStyleICMPv6;
    }
    // 3. 設(shè)置 delegate,用于接收回調(diào)信息
    self.simplePing.delegate = self;
    // 4. 開始 ping
    [self.simplePing start];

然后在delegate中進行回調(diào),代理方法中提現(xiàn)了ping的過程:

// [self.simplePing start] 成功之后,解析 HostName 拿到 ip 地址之后币狠,發(fā)送封包
- (void)simplePing:(SimplePing *)pinger didStartWithAddress:(NSData *)address
{
    //這里面可以創(chuàng)建一個時間戳NSTimer定時發(fā)送數(shù)據(jù)監(jiān)測
    [self.simplePing sendPingWithData:nil];
}

// [self.simplePing start] ping 功能啟動失敗
- (void)simplePing:(SimplePing *)pinger didFailWithError:(NSError *)error
{
    //停止所以的請求游两,如果有時間戳也停止
    [self.simplePing stop];
}

// sendPingWithData 發(fā)送數(shù)據(jù)成功 
- (void)simplePing:(SimplePing *)pinger didSendPacket:(NSData *)packet sequenceNumber:(uint16_t)sequenceNumber
{
    NSLog(@"#%u sent", sequenceNumber);
}

 // sendPingWithData 發(fā)送數(shù)據(jù)失敗,并返回錯誤信息
- (void)simplePing:(SimplePing *)pinger didFailToSendPacket:(NSData *)packet sequenceNumber:(uint16_t)sequenceNumber error:(NSError *)error
{
     NSLog(@"#%u send failed: %@", sequenceNumber,error);
}

// ping 發(fā)送封包之后收到響應(yīng)
- (void)simplePing:(SimplePing *)pinger didReceivePingResponsePacket:(NSData *)packet sequenceNumber:(uint16_t)sequenceNumber
{
    NSLog(@"#%u received, size=%zu", sequenceNumber, packet.length);
}

// ping 接收響應(yīng)封包發(fā)生異常
- (void)simplePing:(SimplePing *)pinger didReceiveUnexpectedPacket:(NSData *)packet
{
    NSLog(@"unexpected packet, size=%zu", packet.length);
}

??梳理了一下使用SimplePing類進行 ping 操作的流程如下圖所示:

SimplePing流程

注意SimplePing對象實例化一定要使用一直持有對象的屬性方法漩绵。
??因此贱案,在Reachability的方法優(yōu)化后采用了ping更加精確的獲取網(wǎng)絡(luò)的連接狀態(tài),網(wǎng)上有的不錯的第三方庫比如RealReachability就是采用了這種方法止吐。

Demo下載

參考文檔

https://blog.csdn.net/mnbvcxz111123/article/details/54286050
Traceroute(路由追蹤)的原理及實現(xiàn)
iOS--網(wǎng)絡(luò)測試小工具(ping tarceroute)
網(wǎng)易網(wǎng)絡(luò)診斷

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宝踪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子碍扔,更是在濱河造成了極大的恐慌瘩燥,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件不同,死亡現(xiàn)場離奇詭異厉膀,居然都是意外死亡,警方通過查閱死者的電腦和手機二拐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門服鹅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人百新,你說我怎么就攤上這事企软。” “怎么了吟孙?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長聚蝶。 經(jīng)常有香客問我杰妓,道長,這世上最難降的妖魔是什么碘勉? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任巷挥,我火速辦了婚禮,結(jié)果婚禮上验靡,老公的妹妹穿的比我還像新娘倍宾。我一直安慰自己,他們只是感情好胜嗓,可當我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布高职。 她就那樣靜靜地躺著,像睡著了一般辞州。 火紅的嫁衣襯著肌膚如雪怔锌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天,我揣著相機與錄音埃元,去河邊找鬼涝涤。 笑死,一個胖子當著我的面吹牛岛杀,可吹牛的內(nèi)容都是我干的阔拳。 我是一名探鬼主播,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼类嗤,長吁一口氣:“原來是場噩夢啊……” “哼糊肠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起土浸,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤罪针,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后黄伊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泪酱,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡滤淳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年术健,在試婚紗的時候發(fā)現(xiàn)自己被綠了缓艳。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亲桥。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡昼牛,死狀恐怖虽缕,靈堂內(nèi)的尸體忽然破棺而出台妆,到底是詐尸還是另有隱情础锐,我是刑警寧澤扶叉,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布勿锅,位于F島的核電站,受9級特大地震影響枣氧,放射性物質(zhì)發(fā)生泄漏溢十。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一达吞、第九天 我趴在偏房一處隱蔽的房頂上張望张弛。 院中可真熱鬧,春花似錦酪劫、人聲如沸吞鸭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刻剥。三九已至,卻和暖如春滩字,著一層夾襖步出監(jiān)牢的瞬間透敌,已是汗流浹背盯滚。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留酗电,地道東北人魄藕。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像撵术,于是被迫代替她去往敵國和親背率。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,747評論 2 361

推薦閱讀更多精彩內(nèi)容