概述

在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访问失败严重,多试几次。

源代码树型结构如下。

git clone https://github.com/yuyoucuobei/epollicmp

tree epollicmp/

epollicmp/

├── makefile

├── README.md

└── src

    ├── define.h

    ├── epollicmp.cpp

    ├── epollicmp.h

    └── main.cpp

结构比较简单,根目录下是编译用的makefile,src目录下是全部的源代码文件,包括结构体定义的define.h文件,主要的业务逻辑类CEpollIcmp所在的epollicmp.h和epollicmp.cpp文件,以及程序入口的main.cpp文件。

简单讲一下CEpollIcmp类的逻辑。

  1. CepollIcmp类封装了epoll的基本操作,包括epoll的创建,添加事件,监听循环等操作。
  2. CepollIcmp类封装了icmp的收发包操作,包括icmp的封包,发送,收包,解包等操作。
  3. CepollIcmp类封装了消息包的缓存和统计操作,包括请求包的缓存,响应包的时间计算,响应时间的极值统计和均值统计等。

epollicmp.h文件内容:

#pragma once

#include "define.h"

class CEpollIcmp

{

public:

    CEpollIcmp();

    ~CEpollIcmp();

    int start(const string &remote_ip,

                int interval=DEFAULT_INTERVAL,

                int pkglen=DEFAULT_PKGLEN);

    int stop();

private:

    int initSock();

    int mainLoop();

    static void *thread_func_send_icmp(void *argv);

    //checksum

    unsigned short cal_chksum(unsigned short *addr,int len);

    struct timeval cal_time_offset(struct timeval begin, struct timeval end);

    void icmp_pack(struct icmp* icmphdr, int seq, int length);

    int icmp_unpack(char* buf, int len);

    int set_nonblock(int sockfd);

    void statistic_print();

private:

    string m_strRemoteIp;

    int m_iInterval;  //microseconds

    int m_iPkgLen;

    int m_iEpollFd;

    int m_iSocketIcmp;

    bool m_bContinue;

    sockaddr_in m_addrDest;

    pthread_t m_threadidSend;

    int m_iSendCount;

    int m_iRecvCount;

    struct timeval m_tStarttime;

    struct timeval m_tEndtime;

    float m_fRespMax;

    float m_fRespMin;

    float m_fRespAll;

    map<int, PACKET_STATUS*> m_mapPacketStatus;

    mutex m_mtxMap;

};

现在再回来重看代码,从设计的角度看,应该再对CEpollIcmp类的三个主要功能拆分成3个类,分别是epoll操作类,icmp包操作类和统计类,再通过一个业务逻辑类把它们组织起来。

编译

获取完整的源代码后,进入根目录,直接使用make编译

cd epollicmp

make

##########COMPILE /root/zr/epollicmp/src/epollicmp.cpp##########

g++  -g -Wall -O0 -std=c++11   -I/root/zr/epollicmp/src/ -c /root/zr/epollicmp/src/epollicmp.cpp -o /root/zr/epollicmp/src/epollicmp.o

##########COMPILE /root/zr/epollicmp/src/main.cpp##########

g++  -g -Wall -O0 -std=c++11   -I/root/zr/epollicmp/src/ -c /root/zr/epollicmp/src/main.cpp -o /root/zr/epollicmp/src/main.o

##########LINK epollicmp##########

g++  -g -Wall -O0 -std=c++11 -L./libs -lpthread -lrt -lm   -I/root/zr/epollicmp/src/  /root/zr/epollicmp/src/epollicmp.o /root/zr/epollicmp/src/main.o -o epollicmp

##########COMPILE OVER##########

在根目录下可以看到编译好的epollicmp文件

-rwxr-xr-x. 1 root root 199864 9月  24 11:07 epollicmp

测试

直接执行文件epollicmp,可以看到使用方法

./epollicmp

USAGE:  ./epollicmp destaddr(url/ip) icmp_interval(ms) icmp_pkglen(byte)

使用 CTRL+C 停止程序

测试本地服务器到局域网的网络状况

./epollicmp 192.168.0.110 20 200

epollicmp start 192.168.0.110 20 200

CEpollIcmp::start start

CEpollIcmp::initSock start

PING 192.168.0.110, (192.168.0.110) (200) bytes of data every (20) microsecond.

CEpollIcmp::mainLoop start

200 bytes from 192.168.0.110: icmp_seq=1 ttl=128 rtt=3.099 ms

...

200 bytes from 192.168.0.110: icmp_seq=522 ttl=128 rtt=0.369 ms

^CCEpollIcmp::stop start

CEpollIcmp::mainLoop end

PING 192.168.0.110, (192.168.0.110) (200) bytes of data every (20) microsecond.

STATISTIC:

ping duration:10.515 second

send count:522

recv count:522

lose rate:0.00%

resp min:0.328 ms

resp max:4.350 ms

resp average:1.026 ms

epollicmp end

测试本地服务器到baidu的网络状况

./epollicmp www.baidu.com 20 200

epollicmp start www.baidu.com 20 200

CEpollIcmp::start start

CEpollIcmp::initSock start

PING www.baidu.com, (14.215.177.39) (200) bytes of data every (20) microsecond.

CEpollIcmp::mainLoop start

200 bytes from 14.215.177.39: icmp_seq=1 ttl=55 rtt=6.692 ms

...

200 bytes from 14.215.177.39: icmp_seq=1028 ttl=55 rtt=6.884 ms

^CCEpollIcmp::stop start

CEpollIcmp::mainLoop end

PING www.baidu.com, (14.215.177.39) (200) bytes of data every (20) microsecond.

STATISTIC:

ping duration:20.723 second

send count:1029

recv count:1029

lose rate:0.00%

resp min:5.496 ms

resp max:13.125 ms

resp average:6.752 ms

epollicmp end

总结

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

本文使用epoll实现一个简单的ping工具,对epoll的基本使用方法和icmp包的收发包有一定的参考价值。

学习最好的办法还是亲自动手试试,just do it。


空空如常

求真得真

epoll实现快速ping的更多相关文章

  1. [na][tools]快速ping网段工具-QuickPing

    一款神器 quickping 能够很快的探测出该网断分出去哪些地址. 在线的会显示绿色 在线的+有主机名的显示为亮绿色

  2. Linux下网络排查之ping|traceroute|mtr工具(zz)

      1.ping ping使用了ICMP回送请求和回送应答报文.ping工具发出去的数据包没有通过tcp/udp协议,但是要经过ip协议.ping命令计算的时间是数据包的往返总时间. ping命令常用 ...

  3. epoll好文章

    https://www.cnblogs.com/apprentice89/p/3234677.html https://www.jianshu.com/p/aa486512e989 https://c ...

  4. 超长干货丨Kubernetes网络快速入门完全指南

    Kubernetes网络一直是一个非常复杂的主题.本文将介绍Kubernetes实际如何创建网络以及如何为Kubernetes集群设置网络. 本文不包括如何设置Kubernetes集群.这篇文章中的所 ...

  5. BT渗透工具使用学习笔记

    BT51.信息收集2.扫描工具3.漏洞发现4.社会工程学工具5.运用层攻击MSF6.局域网攻击7.密码破解8.维持访问一.DNS信息收集1.Dnsenum/pentest/enumeration/dn ...

  6. 超哥笔记 --nginx入门(6)

    一 NGINX 1 nignx是什么 nginx是一个开源的支持高性能,高并发的web服务和代理服务软件. nginx比他大哥apache性能改进许多,nginx占用的系统资源更少,支持高并发连接,有 ...

  7. 使用 PsPing & PaPing 进行 TCP 端口连通性测试

    PsPing & PaPing 介绍 通常,我们测试数据包能否通过 IP 协议到达特定主机时,都习惯使用 ping 命令.工作时 ping 向目标主机发送一个 IMCP Echo 请求的数据包 ...

  8. linux、windows搭建nginx出现问题集锦

    1.启动提示端口被占用(linux) 启动ninx出现nginx: [emerg] bind() to0.0.0.0:80 failed (98: Address already in use) ne ...

  9. 【虚拟机-虚拟网络】使用 PsPing & PaPing 进行 TCP 端口连通性测试

    PsPing & PaPing 介绍 通常,我们测试数据包能否通过 IP 协议到达特定主机时,都习惯使用 ping 命令.工作时 ping 向目标主机发送一个 IMCP Echo 请求的数据包 ...

随机推荐

  1. C#窗体间互相传值

    Demo窗体图片,Form1 Demo窗体图片,Form2 公共委托 using System; namespace _DeleFrm{  public class Dele  {    public ...

  2. JavaScript高级程序设计(读书笔记)之BOM

    BOM(Browser Object Model)提供了很多对象用于访问浏览器的功能,这些功能与任何网页内容无关. 8.1 window对象 BOM的核心对象是window,它表示一个浏览器实例.在浏 ...

  3. Jenkins 构建JOB失败

    问题描述 同事在使用Jenkins打包项目的时候报错 error:index-pack died of signal 15 fatal: index-pack failed 出现这个问题,初步怀疑是拉 ...

  4. RTSP H264/HEVC 流 Wasm 播放

    本文将介绍 RTSP H264/HEVC 裸流如何于网页前端播放.涉及 WebSocket 代理发送流数据, Wasm 前端解码等. 代码: https://github.com/ikuokuo/rt ...

  5. 利用job提升马哈鱼数据血缘分析效率

    利用job提升马哈鱼数据血缘分析效率 一.Job基本知识 前面文章中已介绍马哈鱼的基本功能,其中一个是job,job其实是一个任务集合处理的概念,就是让用户通过job,可以一次递交所有需要处理的 SQ ...

  6. token过期时间

    token有两个有效期,在config/jwt.php下面 # ./config/jwt.php'ttl' => env('JWT_TTL', 600), ##600min=10h 'refre ...

  7. 恶意软件开发——突破SESSION 0 隔离的远线程注入

    一.前言 在Windows XP,Windows Server 2003以及更早的版本中,第一个登录的用户以及Windows的所有服务都运行在Session 0上,这样的做法导致用户使用的应用程序可能 ...

  8. Mac上Markdown的使用

    Markdown是什么,且听我快快道来. 20年前,我第一次接触互联网,当时还是用 28.8k的猫拨号. 我从一本<电脑报>附赠的光盘里,找到了 台湾版的"烘培机"(烘 ...

  9. CodeForce-792C Divide by Three(数学)

    Divide by Three CodeForces - 792C 有一个正整数 n 写在黑板上.它有不超过 105 位. 你需要通过删除一些位使得他变成一个美丽的数,并且需要删除尽量少的位数.删除的 ...

  10. PHP出现iconv(): Detected an illegal character in input string

    PHP传给JS字符串用ecsape转换加到url里,又用PHP接收,再用网上找的unscape函数转换一下,这样得到的字符串是UTF-8的,但我需要的是GB2312,于是用iconv转换 开始是这样用 ...