天天看點

epoll實作快速ping

epoll實作快速ping

概述

在VOIP的營運過程中,最常見的一類問題就是語音品質問題,網絡間的丢包、延遲、抖動都會造成語音品質的體驗下降。

當現網出現語音品質問題的時候,我們有沒有工具能夠快速的界定問題的邊界,縮小排查的範圍,是營運過程中的重要環節。

ping是我們檢視網絡狀況最常用的工具,簡單好用,但是也有很多限制,比如發包廂隔等。

VOIP常見的媒體格式G711的發包廂隔為20ms,單包大小在210位元組左右.

作為C/C++開發,epoll也是我們必點的技能點。

是以,幹脆自己用epoll開發一個沒有限制的ping包檢測工具,一舉多得。

需求功能點:類ping工具,沒有發包廂隔限制,可以設定包大小,網絡模型使用epoll實作。

環境

centos:CentOS  release 7.0 (Final)或以上版本

GCC:4.8.5

代碼

完整的源代碼在我的git庫,可以直接下載下傳檢視。現在git通路失敗嚴重,多試幾次。

源代碼樹型結構如下。

結構比較簡單,根目錄下是編譯用的makefile,src目錄下是全部的源代碼檔案,包括結構體定義的define.h檔案,主要的業務邏輯類CEpollIcmp所在的epollicmp.h和epollicmp.cpp檔案,以及程式入口的main.cpp檔案。

簡單講一下CEpollIcmp類的邏輯。

CepollIcmp類封裝了epoll的基本操作,包括epoll的建立,添加事件,監聽循環等操作。

CepollIcmp類封裝了icmp的收發包操作,包括icmp的封包,發送,收包,解包等操作。

CepollIcmp類封裝了消息包的緩存和統計操作,包括請求包的緩存,響應包的時間計算,響應時間的極值統計和均值統計等。

epollicmp.h檔案内容:

現在再回來重看代碼,從設計的角度看,應該再對CEpollIcmp類的三個主要功能拆分成3個類,分别是epoll操作類,icmp包操作類和統計類,再通過一個業務邏輯類把它們組織起來。

編譯

擷取完整的源代碼後,進入根目錄,直接使用make編譯

在根目錄下可以看到編譯好的epollicmp檔案

測試

直接執行檔案epollicmp,可以看到使用方法

使用 CTRL+C 停止程式

測試本地伺服器到區域網路的網絡狀況

測試本地伺服器到baidu的網絡狀況

總結

完整的源代碼在我的git庫,https://github.com/yuyoucuobei/epollicmp

本文使用epoll實作一個簡單的ping工具,對epoll的基本使用方法和icmp包的收發包有一定的參考價值。

學習最好的辦法還是親自動手試試,just do it。

空空如常

求真得真