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访问失败严重,多试几次。
源代码树型结构如下。
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类的逻辑。
- CepollIcmp类封装了epoll的基本操作,包括epoll的创建,添加事件,监听循环等操作。
- CepollIcmp类封装了icmp的收发包操作,包括icmp的封包,发送,收包,解包等操作。
- 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的更多相关文章
- [na][tools]快速ping网段工具-QuickPing
一款神器 quickping 能够很快的探测出该网断分出去哪些地址. 在线的会显示绿色 在线的+有主机名的显示为亮绿色
- Linux下网络排查之ping|traceroute|mtr工具(zz)
1.ping ping使用了ICMP回送请求和回送应答报文.ping工具发出去的数据包没有通过tcp/udp协议,但是要经过ip协议.ping命令计算的时间是数据包的往返总时间. ping命令常用 ...
- epoll好文章
https://www.cnblogs.com/apprentice89/p/3234677.html https://www.jianshu.com/p/aa486512e989 https://c ...
- 超长干货丨Kubernetes网络快速入门完全指南
Kubernetes网络一直是一个非常复杂的主题.本文将介绍Kubernetes实际如何创建网络以及如何为Kubernetes集群设置网络. 本文不包括如何设置Kubernetes集群.这篇文章中的所 ...
- BT渗透工具使用学习笔记
BT51.信息收集2.扫描工具3.漏洞发现4.社会工程学工具5.运用层攻击MSF6.局域网攻击7.密码破解8.维持访问一.DNS信息收集1.Dnsenum/pentest/enumeration/dn ...
- 超哥笔记 --nginx入门(6)
一 NGINX 1 nignx是什么 nginx是一个开源的支持高性能,高并发的web服务和代理服务软件. nginx比他大哥apache性能改进许多,nginx占用的系统资源更少,支持高并发连接,有 ...
- 使用 PsPing & PaPing 进行 TCP 端口连通性测试
PsPing & PaPing 介绍 通常,我们测试数据包能否通过 IP 协议到达特定主机时,都习惯使用 ping 命令.工作时 ping 向目标主机发送一个 IMCP Echo 请求的数据包 ...
- linux、windows搭建nginx出现问题集锦
1.启动提示端口被占用(linux) 启动ninx出现nginx: [emerg] bind() to0.0.0.0:80 failed (98: Address already in use) ne ...
- 【虚拟机-虚拟网络】使用 PsPing & PaPing 进行 TCP 端口连通性测试
PsPing & PaPing 介绍 通常,我们测试数据包能否通过 IP 协议到达特定主机时,都习惯使用 ping 命令.工作时 ping 向目标主机发送一个 IMCP Echo 请求的数据包 ...
随机推荐
- Linux中MySQL的安装以及卸载
一.MySQL MySQL是一种开放源代码的关系型数据库管理系统,开发者为瑞典MySQL AB公司.在2008年1月16号被Sun公司收购.而2009年,SUN又被Oracle收购.目前 MySQL被 ...
- zigzag走线原理及应用
电路板上弯弯扭扭的走线有什么用 往期文章: 一文读懂高速互联的阻抗及反射(上) 一文读懂高速互联的阻抗及反射(中) 前面几篇文章有部分读者反馈太深奥,不好懂,要求来一点轻松易懂的.这不,它来了!本期文 ...
- JS 根据id实现局部打印
// 打印初审收费清单 getOrderCostBille(){ var head_str = "<html><head><title> ...
- 你的 SQL 还在回表查询吗?快给它安排覆盖索引
什么是回表查询 小伙伴们可以先看这篇文章了解下什么是聚集索引和辅助索引:Are You OK?主键.聚集索引.辅助索引,简单回顾下,聚集索引的叶子节点包含完整的行数据,而非聚集索引的叶子节点存储的是每 ...
- 关于 antd tree 组件的推拽操作
最近项目中使用到 tree 组件的推拽操作, 按常理来说应该主要用到其中的 onDrop 事件,但其中的参数又没有详细的说明,只是在官网给了个例子,网上搜索后又没有发现到位的总结. 因此经过N次的测试 ...
- [考试总结]noip模拟43
这个题目出的还是很偷懒.... 第一题...第二题...第三题...四.... 好吧... 这几次考得都有些问题,似乎可能是有些疲惫,脑袋也是转不太动,考完总觉得自己是能力的问题,但是改一分钟之后会发 ...
- 异步处理方式之信号(三):kill、raise、alarm、pause函数简介
文章目录 6. 函数kill和raise 7. 函数alarm和pause 7.1 alarm() 7.2 pause() 6. 函数kill和raise kill函数用来将信号发送给进程或者进程组. ...
- 只需3步,快来用AI预测你爱的球队下一场能赢吗?
摘要:作为球迷,我们有时候希望自己拥有预测未来的能力. 本文分享自华为云社区<用 AI 预测球赛结果只需三步,看看你爱的球队下一场能赢吗?>,作者:HWCloudAI. 还记得今年夏天的欧 ...
- 任由文字肆意流淌,更自由的开源 Markdown 编辑器
对于创作平台来说内容编辑器是十分重要的功能,强大的编辑器可以让创作者专注于创作"笔"下生花.而最好取悦程序员创作者的方法之一就是支持 Markdown 写作,因为大多数程序员都是用 ...
- 从线上日志统计接口访问量QPS
这一阵子在面试,连续遇到好几家(大小厂都有)问我的项目线上qps的情况了,说实话,我作为一个大头兵,本来没关注过这个数据,只能含混地给个"大概.也许"的回答. 回来之后,我决定对业 ...