博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ Ping源码(Linux/Unix)
阅读量:7281 次
发布时间:2019-06-30

本文共 2356 字,大约阅读时间需要 7 分钟。

前言

  在项目中,需要用到判断主机是否可以ping,于是在网上找到了使用C语言的ping源码,但是难以复用,并加以改善:加入超时处理,容错处理,以C++类的封装性,调用更加简单。

  本代码在ubuntu和freebsd上测试均都通过,理论上兼容Linux和Unix

源代码简介

  源代码分为三个文件:ping.h ping.cpp main.cpp,其中ping.h和ping.cpp提供了Ping类的操作,main.cpp是使用Ping类的使用例子,已经使用Ping类写了一个简单的ping程序。把Ping的输出移到了main.cpp,所以输出集中在main.cpp,主要的ping的逻辑处理在ping.h ping.cpp。

  实际使用过程中只需要ping.h ping.cpp就行了。

代码使用范例

 

    示例代码很简单,只要实例化Ping类,调用ping操作,结果通过PingResult返回,其中ping方法返回false,可能是没有root权限,也可能是因为host和ip非法,无法转换为合法的ip。

 

如果要判断一台主机是否可以ping,可以判断pingResult返回的IcmpEchoReply的isReply是否为true,ture表示有响应ping,false表示没有响应ping。

//main.cpp #include "ping.h" #include 
void showPingResult(PingResult pingResult); int main(int argc,char *argv[]) {
if (argc != 2) {
printf("usage: ping
\n"); return 0; } char * hostOrIp = argv[1]; int nsend = 0, nreceived = 0; bool ret; PingResult pingResult; Ping ping = Ping(); for (int count = 1; count <= 4; count++) {
ret = ping.ping(hostOrIp, 1, pingResult); if (count == 1) {
printf("PING %s(%s): %d bytes data in ICMP packets.\n",hostOrIp, pingResult.ip.c_str(), pingResult.dataLen); } if (!ret) {
printf("%s\n", pingResult.error.c_str()); break; } showPingResult(pingResult); nsend += pingResult.nsend; nreceived += pingResult.nreceived; } if (ret) {
printf("%d packets transmitted, %d received , %%%d lost\n", nsend, nreceived, (nsend - nreceived) / nsend * 100); } return 0; } void showPingResult(PingResult pingResult) {
for (unsigned int icmpEchoReplyIndex = 0; icmpEchoReplyIndex < pingResult.icmpEchoReplys.size(); icmpEchoReplyIndex++) {
IcmpEchoReply icmpEchoReply = pingResult.icmpEchoReplys.at(icmpEchoReplyIndex); if (icmpEchoReply.isReply) {
printf("%d byte from %s: icmp_seq=%u ttl=%d rtt=%.3f ms\n", icmpEchoReply.icmpLen, icmpEchoReply.fromAddr.c_str(), icmpEchoReply.icmpSeq, icmpEchoReply.ipTtl, icmpEchoReply.rtt); } else {
printf("request timeout\n"); } } }

 

下载和使用代码

编译

g++ ping.cpp main.cpp ping

使用示例程序

#测试hostname的ping ./ping www.baidu.com #测试ip的ping ./ping 8.8.8.8 #测试不存在的ip的ping ./ping 8.8.8.1  #测试错误ip或者host的ping ./ping @#%$@#%#@$%

转载地址:http://bdkjm.baihongyu.com/

你可能感兴趣的文章
人生感悟 --如何提升工作效率
查看>>
我的友情链接
查看>>
浅谈的springboot的项目部署方式
查看>>
构造函数与虚构函数
查看>>
TeamView修改ID
查看>>
DevExpress v18.1新版亮点——WPF篇(五)
查看>>
工作心得
查看>>
linux上安装组播测试工具ssmping
查看>>
物联网蓝牙发展以后将会普及那些领域?
查看>>
centos7配置iscsi网络存储
查看>>
决心书
查看>>
lua中print
查看>>
ios 使用UIImagePickerController 修改头像
查看>>
jqgrid初学一
查看>>
TypeScript React Starter
查看>>
97259
查看>>
php实现分页代码
查看>>
linux中文件索引节点知识
查看>>
掌握这10条规范,轻松搞定Git!
查看>>
Linux第一周学习笔记(2)
查看>>