自己实现linux下ping工具

Linux ping的原理与实现 1. ping过程: 我们以下面一个网络为例:有A、B、C、D四台机子,一台路由RA,子网掩码均为255.255.255.0,默认网关为192.168.0.1 1、在同一网段内 在主机A上运行“Ping 192.168.0.5”后,都发生了些什么呢? 首先,Ping命令会构建一个固定格式的ICMP请求数据包,然后由ICMP协议将这个数据包连同地址“192.168.0.5”一起交给IP层协议(... 阅读详情

 一 原理

    ping命令工作在ip层,在程序中通过raw scket进行数据的收发,发数据时不需要填充ip头部,但是在接收数据时需要过滤掉ip头部信息。icmp头部重要的字段有三个,type,code,checksum,其中type表示命令的类型,对于ping命令来说,type的值为8表示发送icmp,type值为0表示是icmp的回包,code表示type下的子命令,对于ping命令来说,code的值为0。checksum字段表示icmp包的校验字段,校验方法为对icmp的所有字段取和再取反码。

 

二 实现代码:

   /*ping.h*/

 

#ifndef __SAM_PING_
#define __SAM_PING_

#include    "stdlib.h"
#include    "string.h"
#include    "stdio.h"
#include    "fcntl.h"
#include    "errno.h"
#include    "signal.h"
#include    "sys/types.h"
#include    "sys/socket.h"
#include    "sys/time.h"
#include    "netinet/in.h"
#include    "arpa/inet.h"
#include    "netdb.h"

#define MAXBUFFLEN 200

#define ICMP_ECHO 8 /* icmp echo requir */
#define ICMP_ECHOREPLY 0 /* icmp echo reply */
#define ICMP_HEADSIZE 8 /* icmp packet header size */
#define IP_HEADSIZE 20 /* ip packet header size */
#pragma  pack(1)
typedef struct tagIpHead /* icmp packet header */
{
    u_char ip_verlen; /* ip version and ip header lenth*/
    u_char ip_tos; /* ip type of service */
    u_short ip_len; /* ip packet lenghth */
    u_short ip_id; /* ip packet identification */
    u_short ip_fragoff; /* ip packet fragment and offset */
    u_char ip_ttl; /* ip packet time to live */
    u_char ip_proto; /* ip packet protocol type */
    u_short ip_chksum; /* ip packet header checksum */
    u_long ip_src_addr; /* ip source ip adress */
    u_long ip_dst_addr; /* ip destination ip adress */
} IPHEAD;

typedef struct tagIcmpHead /* icmp header */
{
    u_char icmp_type; /* icmp service type */
    /* 8 echo require, 0 echo reply */
    u_char icmp_code; /* icmp header code */
    u_short icmp_chksum; /* icmp header chksum */
    u_short icmp_id; /* icmp packet identification */
    u_short icmp_seq; /* icmp packet sequent */
    u_char icmp_data[1]; /* icmp data, use as pointer */
} ICMPHEAD;
#pragma pack()
class CICMP
{
private:
    int m_iSocket;
    int m_iPkgSize;
    long m_iSendTime;             /*发送ping包的时间戳*/
    long m_iRecvTime;             /*接收ping包的时间戳*/
    long m_iDelay;
    IPHEAD m_stIpHead;
    ICMPHEAD m_stIcmpHead;
    char m_szIcmpData[MAXBUFFLEN];
protected:
    long TimeNow();
    bool validChkSum(ushort* buffer,int size);
    u_short ChkSum(u_short* pIcmpData,int iDataLen);
    int ParseRecv(IPHEAD* pHeader,int size);
public:
    CICMP(int pkgSize = 0):m_iPkgSize(pkgSize){memset(m_szIcmpData,0,MAXBUFFLEN);}
    int CreateRawSocket();
    int Ping(const char* szIp,int pkgSize);
    int Stat();
    int Receive();
};

#endif

 

 

/*ping.cpp*/

 

 

#include "ping.h"
#include <iostream>
#include <string>

using namespace std;

u_short CICMP::ChkSum( u_short * buffer, int size )
/* for check sum of icmp header */
{
    unsigned long cksum=0;
    while(size >1)
    {
        cksum+=*buffer++;
        size-=sizeof(unsigned short);
    }
    if(size) cksum+=*(unsigned short*)buffer;
    cksum=(cksum >> 16)+(cksum&0xffff);
    cksum+=(cksum >>16);
    return (unsigned short)(~cksum);

}

bool CICMP::validChkSum(unsigned short *buffer, int size)
{
    unsigned long cksum=0;
    while(size >1)
    {
        cksum+=*buffer++;
        size-=sizeof(unsigned short);
    }
    if(size) cksum+=*(unsigned short*)buffer;
    cksum=(cksum >> 16)+(cksum&0xffff);
    cksum+=(cksum >>16);
    return ((unsigned short)cksum == 0xFFFF);
}


int CICMP::CreateRawSocket()
{
    this->m_iSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
    if(this->m_iSocket < 0)
    {
        perror("socket");
        return -1;
    }
    return 0;
}

long CICMP::TimeNow()
{
    struct timeval now;
    long lPassed;
    gettimeofday(&now, 0);
    lPassed = now.tv_sec * 1000000 + now.tv_usec;
    /* now.tv_sec in second */
    /* now.tv_usec in 1/1000000 second */
    return lPassed;
}

int CICMP::Ping(const char* szIp,int pkgSize)
{
    struct sockaddr_in descAddr;
    bzero(&descAddr, sizeof(descAddr));
    descAddr.sin_family = AF_INET;
    u_long lHostIp;
    struct hostent* h = NULL;
    /* check host format */
    if ( ( lHostIp = inet_addr(szIp) ) != INADDR_NONE )
    {
        /* is available ip adress */
        //cout << "is available ip address" << endl;
        descAddr.sin_addr.s_addr = lHostIp;
    }
    else if ( h = gethostbyname(szIp))
    {
        /* is available host name */
        /* from hosts file of local host */
        /* or from DNS */
        //cout << "is available host name" << endl;
        bcopy(h->h_addr, &descAddr.sin_addr, h->h_length);
    }
    else
    {
        /* bad ip adress or host name */
        /* exit */
        fprintf( stderr, "bad IP or host/n" );
        return -1;
    }
    cout << "ping " << szIp<< endl;
    //begin Ping
    int iPacketSize = 0;
    char* buf = new char[MAXBUFFLEN];
    memset(buf,0,MAXBUFFLEN);
    /* make the icmp header information */
    ICMPHEAD *pIcmpHead = (ICMPHEAD *)buf;
    pIcmpHead->icmp_type = ICMP_ECHO;
    pIcmpHead->icmp_code = 0;
    pIcmpHead->icmp_id = 1;
    pIcmpHead->icmp_seq = 1;
    pIcmpHead->icmp_chksum = 0;

    /* store time information as icmp packet content, 4 bytes */
    /* u may store other information instead */
    *((long *)pIcmpHead->icmp_data) = TimeNow();
    this->m_iSendTime = TimeNow();
    //iPacketSize = ICMP_HEADSIZE + 4; /* icmp packet length */
    iPacketSize = sizeof(ICMPHEAD) + 3;
    /* icmp header check sum */
    pIcmpHead->icmp_chksum = this->ChkSum((u_short *)pIcmpHead, iPacketSize );

    /* remember the time when send for calculate round trip time */
    //lSendTime = time_now();

    /* send the icmp packet to des host */
    //cout << "send pkg size " << iPacketSize << endl;
    if (sendto(m_iSocket, buf, iPacketSize, 0, (struct sockaddr *)&descAddr, sizeof(descAddr) ) < 0)
    {
        perror("send failed");
        delete [] buf;
        return -1;
    }
    delete [] buf;
    //usleep(0);
    return 0;
}

int CICMP::Receive()
{
    struct sockaddr_in fromAddr;
    int size = 0;
    char* buf = new char[MAXBUFFLEN];
    memset(buf,0,MAXBUFFLEN);
    int namelen = sizeof(fromAddr);
    //cout << "before recvfrom" << endl;
    size = recvfrom(this->m_iSocket,buf,MAXBUFFLEN - 1,0,(struct sockaddr *)&fromAddr,(socklen_t*)&namelen);
    if(size == -1)
    {
        cout << "recv ping back failed:" << strerror(errno) << endl;
        return -1;
    }
    IPHEAD* pIpHead = (IPHEAD *)buf;
    //cout << "after recvfrom:" << size << endl;
    /* get the ip packet lenth */
    /* if too small, not the icmp echoreply packet */
    /* give it up */

    int iIpHeadLen = (int)((pIpHead->ip_verlen & 0x0f) << 2);
    if (size < iIpHeadLen + ICMP_HEADSIZE)
    {
        cout << "recv header is too short,give it up" << endl;
        delete buf;
        return -1;
    }
    //int ttl = pIpHead->ip_ttl; /* time to live param */

    /* get the icmp header information */
    ICMPHEAD *pIcmpHead = (ICMPHEAD *)(buf + iIpHeadLen);

    /* not icmp echo reply packet, give it up */
    if (pIcmpHead->icmp_type != ICMP_ECHOREPLY)
    {
        cout << "recv pkg not ICMP reply,give it up" << endl;
        delete buf;
        return -1;
    }
    /* not proper icmp sequent number, give it up */
    if (pIcmpHead->icmp_id != 1 || pIcmpHead->icmp_seq != 1)
    {
        cout << "icmp header's id and seq error" << endl;
        delete buf;
        return -1;
    }
    long iCurTime = this->TimeNow();
    this->m_iRecvTime = iCurTime;
    ParseRecv((IPHEAD *)buf,size);
    delete buf;
    return 0;
}

int CICMP::ParseRecv(IPHEAD * pHeader,int size)
{
    memcpy(&m_stIpHead,pHeader,sizeof(IPHEAD));
    char* szTmp = (char*)pHeader;
    char* ptrIcmp = szTmp + sizeof(IPHEAD);
    memcpy(&m_stIcmpHead,ptrIcmp,sizeof(ICMPHEAD));

    /* get the data of icmp*/
    szTmp += sizeof(ICMPHEAD) - 1;
    int iDataLen = size - sizeof(IPHEAD) - sizeof(ICMPHEAD) + 1;
    memcpy(m_szIcmpData,szTmp,iDataLen);
    return 0;
}

int CICMP::Stat()
{
    struct in_addr recvFrom;
    memcpy(&recvFrom,&m_stIpHead.ip_src_addr,4);
    u_char ipTTL = this->m_stIpHead.ip_ttl;
    //int iSendTime = atoi(this->m_szIcmpData);
    int iDelayTime = (int)((m_iRecvTime - m_iSendTime)/1000);
    char szBuff[100] = {0};
    char* szIp = inet_ntoa(recvFrom);
    if(szIp == NULL)
    {
        cout << "get src ip failed" << endl;
        return -1;
    }
    sprintf(szBuff,"recv from %s,delay=%ds,TTL=%d",szIp,iDelayTime,ipTTL);
    cout << szBuff << endl;
    return 0;
}

 

测试程序

 

int main(int argc,char** argv)
{
    if(argc != 2)
    {
        cout << "argument: host" << endl;
        return 0;
    }
    char* szIp = argv[1];
    CICMP icmp;
    if(icmp.CreateRawSocket() != 0)
    {
        cout << "create socket failed" << endl;
        return 0;
    }
    if(icmp.Ping(szIp,4) != 0)
    {
        cout << "ping failed" << endl;
        return 0;
    }
    //cout << "send success ,begin to receive" << endl;
    if(icmp.Receive() != 0)
    {
        return 0;
    }
    icmp.Stat();
    return 0;
}

 

Linux批量ping的脚本(Linux工具箱).pdf 立即下载

相关推荐

SystemVerilog学习总结

因为选择的offer是IC验证,以前学的是设计,所以只能再学systemverilog(SV)和UVM了。在学习SV和UVM之前,我认为需要学习以下几个部分:数字电路、c++和verilog。因为IC验证确实有不少别的专业之前没学过数字电路和Verilog,所以还是最好先学习一下。 知识点的总结主要是通过systemverilog验证-测试平台编写指南这本书进行的,所以请看书。通过对这本书的目录进行重点的划分,然后再进行相关知识点的总结。最后,给出自己收集的别的博主IC EDA环境的虚拟机,以及使用虚拟机需

博主毕竟还是人,肯定会有错误,各位看的时候发现错误提出来就好 1万+

Linux中ping脚本

1、工作场景   最近遇到一个比较难解决的问题,每天需要Ping大量的IP地址,并且需要将正常、异常的IP地址皆导出来,如果手动Ping则至少需要几个小时,后来就在linux中用shell编写了一个简单的群Ping脚本,只需要把需要Ping的地址放在文件中就可以了。 2、主脚本命令 #!/bin/bash #运行IP测试脚本。 for IP in `cat IP.txt` #ip.txt需要提前创建,并且把需要ping的ip存放进去。 do ping -c 1 -i 0.2 -W 1 $IP

剁椒鱼头没剁椒的博客 5933

森林冰火人html源码,森林冰火人单人版(源码)

【实例简介】java小游戏——森林冰火人,单人游戏, 实现人物行走,跳跃,吃水晶,具有计时功能,积分功能,倒计时结束游戏失败。【实例截图】【核心代码】森林冰火人单人版├── bin│ ├── game│ │ ├── Help.class│ │ ├── Logon.class│ │ ├── Main.class│ │ ├── Mykey.class│ │ ...

weixin_42507981的博客 6205

windows和linux下的自动ping命令

windows和linux下的自动ping命令

IT技术 953

Cgroup对进程所占用的CPU与内存资源同时进行限制的测试

测试环境:Ubuntu。处理器数量:1CPU。内存大小:2048MB。 以下是测试程序mem_cpu_test.c的代码。 将mem_cpu_test.c编译为可以运行的程序mem_cpu_test。 运行程序,并用top命令查看mem_cpu_test所占用的系统资源情况,可以看到,mem_cpu_test使用了50%左右的内存资源,也就是1000MB左右,并占用了接近全部的CPU资源。 关闭以上的程序后,在Cgroup子系统memory和cpu下分别创建进程组test1和test2。 并设置tes

qq_44998067的博客 1154

科普:Frenet坐标

理想情况下,描述这种常见驾驶行为在数学上应该很容易。一种方法是使用新的坐标系。现在,而不是放下一个正常的笛卡尔网格,我们做一些事情,就像你看到下面…Frenet Coordinates是一种以比传统x,y笛卡尔坐标更直观的方式表示道路位置的方式。如果我们想要方程式来描述这个动作,那就不容易了!想象一下像下面这样一条弯曲的道路,笛卡尔坐标系就位于它的上面…使用这些笛卡尔坐标,我们可以尝试描述车辆通常在路上行驶的路径…那么在Frenet坐标系下呈现的典型轨迹是什么样的?在这里,我们定义了一个新的坐标系统。

OceanStar的博客 1万+

Linux Shell脚本批量PING

需求: 通过Linux服务器定时ping验证目标IP地址连通情况。 目标IP地址以TXT文件方式存储在本地。 生成的测试记录包含测试时间、目标IP地址、连通情况。 1、测试目的IP地址列表 39.156.66.18 203.119.129.109 111.30.164.236 2、批量PING脚本 #!/bin/bash # #获取当前时间 datetimevar=`date "+%Y-%m-%d %H:%M:%S"` #读取IP列表行数 lineNumber=`cat iplist.txt |wc.

p.deng²⁰⁵ᐟ₅₁₂ 6672

Dify+MCP 双剑合璧:告别知识库模糊统计,让AI精准查询数据库数据!

本文详细介绍了如何通过Dify和MCP的结合,解决知识库在数据库查询中的模糊统计问题。通过MCP中间件将自然语言实时转换为SQL语句,实现精准数据查询,并支持SSE协议持续更新数据。文章包含MySQL环境搭建、MCP服务端部署、Dify工作流配置等实战步骤,帮助用户高效构建智能数据库查询系统。

weixin_33737774的博客 370

Linux中ping命令

网络排查问题常用命令ping

weixin_45432833的博客 1273

MTK平台TP驱动设备树与GPIO配置实战解析

本文详细解析了MTK平台TP驱动开发中的设备树与GPIO配置实战。通过DCT工具配置GPIO引脚,结合设备树节点定义触摸参数,并分享驱动移植、编译调试技巧及常见问题解决方案,帮助开发者快速掌握MTK触摸驱动开发核心。

ice55的博客 236

Open3D(C++) 统计滤波【2025最新版】

 统计滤波器用于去除明显离群点,离群点往往由测量噪声引入,其特征是在空间中分布稀疏,可以理解为:每个点都表达一定信息量,某个区域点越密集则可能信息量越大。噪声信息属于无用信息,信息量较小。所以离群点表达的信息可以忽略不计。...

点云侠的博客 1121

Linux ping 命令

这里表示,我们发出的ICMP报文从自己主机到目标主机一共经过12跳,这里可以想成我们发过去的和对方返回的路由路径是一样的(其实网络很复杂的,这样说是在基本理论上简化问题——一般网络情况不变化就是这样的),也就是目标主机它预设的报文TTL要减掉12。④ 发出去的包数,返回的包数,丢包率,耗费时间;默认情况下,Linux系统的TTL值为64或255,Windows NT/2000/XP系统的TTL值为128,Windows 98系统的TTL值为32,UNIX主机的TTL值为255。

xiaoweids的博客 3345

FlashBootloader01-基于UDS的Flash Bootloader【架构篇】

文章目录1 Flash Bootloader的依赖项2 Flash Bootloader中使用的UDS的主要功能3 Flash Bootloader更新固件3.1 初始化MCU3.2 刷写流程 1 Flash Bootloader的依赖项 通常Flash Bootloader由以下四方面组成: UDS协议 上位机「编写Bootloader Sequence」 通信驱动(如CAN ) Flash Driver 2 Flash Bootloader中使用的UDS的主要功能 1. 10 02服务 客户端

3593

linux下Ping工具的C语言实现

Linux下ping的实现

zangyuanan320的博客 960

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C++:实现ping(附带源码)

本项目实现了一个简单的Ping工具,通过C++使用原始套接字模拟了ICMP协议的工作原理。通过该工具,我们可以检测目标主机的网络连通性并计算网络延迟(RTT)。

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 2352

linux c ping 分析实现

PING(Packet InterNet Groper)中文名为因特网包探索器,是用来查看网络上另一个主机系统的网络连接是否正常的一个工具。ping命令的工作原理是:向网络上的另一个主机系统发送ICMP报文,如果指定系统得到了报文,它将把回复报文传回给发送者,这有点象潜水艇声纳系统中使用的发声装置。所以,我们想知道我这台主机能不能和另一台进行通信,我们首先需要确认的是我们两台主机间的网络是不是通的...

whatday的专栏 1277

linux--ping指令

linux--ping指令1 介绍2 windows下ping2.1 用法2.2 示例2.2.1 ping 127.0.0.12.2.2 ping www.baidu.com2.2.3 ping -t:不间断ping目标地址2.2.4 ping -n count:指定数据包数量2.2.5 ping -l:发送size指定大小的数据包2.2.6 ping -r count:记录所经过路由的数量2.2.7 for /L %D in (1,1,255) do ping XXX.XXX.X.%D:ping网段,批量

天道酬勤 3545

c linux ping 实现

  摘自:https://blog.youkuaiyun.com/weibo1230123/article/details/79891018 ping的实现和代码分析一.介绍 ping命令是用来查看网络上另一个主机系统的网络连接是否正常的一个工具。ping命令的工作原理是:向网络上的另一个主机系统发送ICMP报文,如果指定系统得到了报文,它将把报文一模一样地传回给发送者,这有点象潜...

weixin_30596023的博客 1555

从零开始:用C++打造自己的Ping工具(Linux环境+详细避坑指南)

本文详细介绍了如何在Linux环境下使用C++从零开始开发一个功能完整的Ping工具,涵盖ICMP协议解析、原始套接字编程、权限管理及性能优化等核心知识点。通过源码示例和详细避坑指南,帮助开发者深入理解网络通信原理,并实现高效的网络诊断工具。

yhn4567890的博客 723

Java代码ping ip工具类

package com.v.photos.utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.Charset; /** * @Author.

猪之仆的博客 714

java代码ping服务IP工具类(Windows,Linux环境)

public class PingIpUtils { private static Logger logger = LoggerFactory.getLogger(PingIpUtils.class); /** * @param ipAddress ip地址 * @param pingTimes 次数(一次ping,对方返回的ping的结果的次数)

下一个奇迹 5351

Java中ping ip工具类

注明转载:https://www.cnblogs.com/thcy1314/p/11832983.html package com.v.photos.utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamRe

oak_javaLearner的博客 728

linux ping持续,Linux下长时间ping网络加时间戳并记录到文本

Linux下长时间ping网络加时间戳并记录到文本由于一些原因,比如需要检查网络之间是否存在掉包等问题,会长时间去ping一个地址,由于会输出大量的信息而且最好要有时间戳,因此我们可以使用简单的几个shell命令组合就可以实现:长时间ping一个地址,记录每次ping的时间戳,并输出到文本保存,另外我们还可以将这个动作放到后台去执行,以免登陆注销之后被中断。首先是长时间ping,这个非常简单,使用...

weixin_42303079的博客 3566

Linux编程之PING的实现

Linux编程之PING的实现 PING(Packet InterNet Groper)中文名为因特网包探索器,是用来查看网络上另一个主机系统的网络连接是否正常的一个工具。ping命令的工作原理是:向网络上的另一个主机系统发送ICMP报文,如果指定系统得到了报文,它将把回复报文传回给发送者,这有点象潜水艇声纳系统中使用的发声装置。所以,我们想知道我这台主机能不能和另一台进行通信,我们首先需要确...

u014230625的博客 1191

ping功能的实现原理

1.Windows下ping实现 Windows平台实现ping功能,需要涉及到两个动态库Icmp.dll和Iphlpapi.dll。 根据msdn的说明: “The IcmpParseReplies function is exported from the Icmp.dll on Windows 2000. The IcmpParseReplies fun

xiejianjun417的专栏 3536

iputils深度解析:ping命令背后的工作原理与实现机制

iputils是Linux系统中一套经典的网络工具集合,其中ping命令作为网络诊断的基石,通过ICMP协议实现主机间的连通性检测。本文将深入剖析ping命令的工作原理、实现机制及核心功能,帮助读者理解这一工具如何在底层实现网络探测。 ## 🚀 ping命令的核心功能与工作流程 ping命令的核心功能是通过发送ICMP(Internet控制消息协议)回显请求报文,测量目标主机的可达性和网络往

gitblog_01039的博客 988
上一篇: 使用system()函数要谨慎
下一篇: ubuntu下安装man手册
zhsp1029
博客等级 码龄21年 115粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值