Ping的代码

ping源代码完全解析(1) ping源代码完全解析--------------------------------------------------author:    Zero1,lingyi.pro#163.comdate:        2008-04-27--------------------------------------------------目录-------------1.相关知识2.相关数据结构3. 阅读详情
这是以前自己写的Ping代码, 以ICMP协议为基础
ICMP协议参考: http://baike.baidu.com/view/30564.htm
--------------------------------------------------------------------------------------------------------------------------------------------------
 
//Please link library WS2_32.LIB at first.
// ICMP.h
#include <windows.h>
#ifndef __ICMP_H__
#define __ICMP_H__

#define ICMP_ECHO 8
#define ICMP_REPLAY 0
#define MAX_DATA_SIZE 32
#define ICMP_MIN 8

#pragma pack(1)

typedef struct tagICMPHeader
{
    UCHAR type;
    UCHAR code;
    USHORT checkSum;
    USHORT ID;
    USHORT SeqNumber;
}ICMPHeader, *PICMPHeader;

#pragma pack()
#pragma pack(1)

typedef struct tagIPHeader
{
    BYTE h_len:4;
    BYTE version:4;
    BYTE tos;
    USHORT total_len;
    USHORT ID;
    USHORT flags;
    BYTE ttl;
    BYTE proto;
    USHORT checksum;
    ULONG source_ip;
    ULONG dest_ip;
}IPHeader, *PIPHeader;

#pragma pack()

#endif  // ICMP_H
 
// Ping.h
#include "ICMP.H"
#include <iostream>
using namespace std;
#ifndef __PING_H__
#define __PING_H__

#pragma pack(1)

typedef struct tagPingPacket
{
    ICMPHeader icmp_header;
    DWORD dwTime;
}PingPacket, *PPingPacket;

#pragma pack()
class Ping
{
public:
    Ping();
    ~Ping();
    BOOL StartClient();
 
private:
    void PackPingPacket(PingPacket& ping_packet);
    int UnPackPingPacket();
    int Configuration();
    int ReceivePacket();
    int SendPacket();
    DWORD InitializeConnection();
    int UnitializeConnection();
    DecodePingPacket(const IPHeader& ip_header, const int recvPacketLen);
    friend USHORT ip_checksum(USHORT* buffer, int size);
    friend void ReadIPAddress(unsigned long IPAddress);
private:
    SOCKET sock;
    sockaddr_in dest;
    sockaddr_in source;
};
#endif  // PING_H
 
PING.cpp
#include "PING.H"
const TCHAR* DEFAULT_ADDRESS = TEXT("220.181.27.48");   // LocalHost
const int TIMEOUT = 1000;                                // 1 second
Ping::Ping()
{
    InitializeConnection();
}
Ping::~Ping()
{
    UnitializeConnection();
}
BOOL Ping::StartClient()
{
    while(true)
    {
        if (SendPacket())
        {
             return FALSE;
        }
        if (ReceivePacket())
        {
            return FALSE;
        }
        Sleep(1000);
    }
    return TRUE;
}
 
DWORD Ping::InitializeConnection()
{
    cout << "Initialize Connection!" << endl;
    WSAData wsaData;
    if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0)
    {
        cout << "Startup error!" << endl;
        return GetLastError();
    }
    sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
    if (sock < 0)
    {
        cout << "Create socket error!" << endl;
        return GetLastError();
    }
 
    if (Configuration())
    {
        return GetLastError();
    }
 
    return 0;
}
 
int Ping::Configuration()
{
    int ttl = TIMEOUT;
 
    if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (const char*)&ttl, sizeof(ttl)) == SOCKET_ERROR)
    {
        cout << "Error in Configuration, error code:" <<  GetLastError() << endl;
        return GetLastError();
    }
 
    memset(&dest, 0, sizeof(dest));
    dest.sin_family = AF_INET;
    dest.sin_addr.s_addr = inet_addr(DEFAULT_ADDRESS);
    return 0;
}
 
int Ping::UnitializeConnection()
{
    WSACleanup();
    closesocket(sock);
    cout << "Unitialize Connection!" << endl;
    return 0;
}
 
void Ping::PackPingPacket(PingPacket& ping_packet)
{
    static USHORT ID = 1;
    static USHORT SeqNumber = 1;
    ping_packet.icmp_header.type = ICMP_ECHO;
    ping_packet.icmp_header.code = 0;
    ping_packet.icmp_header.checkSum = 0;
    ping_packet.icmp_header.ID = ID++;
    ping_packet.icmp_header.SeqNumber = SeqNumber++;
    ping_packet.dwTime = GetTickCount();
    ping_packet.icmp_header.checkSum = ip_checksum((USHORT*)&ping_packet, sizeof(ping_packet));
}
 
int Ping::UnPackPingPacket()
{
    return 0;
}
 
int Ping::SendPacket()
{
    PingPacket ping_packet;
    PackPingPacket(ping_packet);
    int retValue = sendto(sock,                                  // Socket
                                 (const char*)&ping_packet,    // Buffer
                                 sizeof(ping_packet),
                                 0,                                       // Flag
                                 (const sockaddr*)&dest,        // The Pointer to Socket Address 
                                 sizeof(dest));                       // Size of Socket Address
    if (retValue < 0)
    {
        cout << "Error in send Packet, error code" << GetLastError() << endl;
        return GetLastError();
    }
    return 0;
}
 
int Ping::ReceivePacket()
{
    // effetive will be worse?
    IPHeader* recv_buf = (IPHeader*)new TCHAR[MAX_DATA_SIZE];
    if (recv_buf == NULL)
    {
        return GetLastError();
    }
    int fromlen = sizeof(source);
    int retValue = recvfrom(sock,
                                    (char*)recv_buf,
                                    MAX_DATA_SIZE, 
                                    0,
                                    (sockaddr*)&source,
                                    &fromlen);
    if (retValue < 0)
    {
        cout << "Error in receive packet, error code" << GetLastError() << endl;
        return GetLastError();
    }
    else
    {
        // Decode ping packet
        DecodePingPacket(*recv_buf, retValue);
    }
    delete []recv_buf;
    recv_buf = NULL;
    return 0;
}
 
USHORT ip_checksum(USHORT* buffer, int size)
{
    unsigned long cksum = 0;
   
    // Sum all the words together, adding the final byte if size is odd
    while (size > 1) {
        cksum += *buffer++;
        size -= sizeof(USHORT);
    }
    if (size) {
        cksum += *(UCHAR*)buffer;
    }
 
    // Do a little shuffling
    cksum = (cksum >> 16) + (cksum & 0xffff);
    cksum += (cksum >> 16);
   
    // Return the bitwise complement of the resulting mishmash
    return (USHORT)(~cksum);
}
 
void ReadIPAddress(unsigned long IPAddress)
{
    printf("%d.%d.%d.%d/n", UCHAR(IPAddress),
                                       UCHAR(IPAddress >> 8),
                                       UCHAR(IPAddress >> 16),
                                       UCHAR(IPAddress >> 24));
}
 
int Ping::DecodePingPacket(const IPHeader& ip_header, const int recvPacketLen)
{
    cout << "IPHeader->source_ip:";
    ReadIPAddress(ip_header.source_ip);
    printf("IPHeader->total_len: %d/r/n", ip_header.total_len);
    printf("IPHeader->tos: %d/r/n", ip_header.tos);
    printf("IPHeader->ID:%d/r/n", ip_header.ID);
    printf("IPheader->ttl:%d/r/n", ip_header.ttl);
    USHORT ipheader_len = ip_header.h_len * 4;
 
    if (recvPacketLen < ipheader_len + ICMP_MIN)
    {
        // Packet is too small
        cout << "Receive packet is too small" << endl;
        return -1;
    }
   
    PingPacket *pingpacket = (PingPacket*)((char*)&ip_header + ipheader_len);
    if (pingpacket == NULL)
    {
        cout << "ICMP Header is NULL" << endl;
        return -1;
    }
 
    if (pingpacket->icmp_header.type == ICMP_REPLAY)
    {
        cout << "Reply Packet" << endl;
        cout << "time:" << int (GetTickCount() - pingpacket->dwTime) << endl;
    }
   
    return 0;
}
 
main.cpp
#include "PING.H"
int main()
{
    Ping myping;
    if (myping.StartClient())
    {
        cout << "Ping Machine Successfully!" << endl;
    }
    else
    {
         cout << "Ping Machine Error!" << endl;
    }
    return 0;
}
ping 检测源代码 ping检测服务器的网络状态,首先发送ICMP报文给服务器,服务器如果收到次报文,则返回同样的ICMP报文。 立即下载

相关推荐

fpga学习——zynq图像处理中的DVP流接口封装

之前文章介绍了基于zynq的图像处理架构问题。其中,作为开发者,需要重点关注图像传感器接口、处理算法、显示接口,这些模块。现在我们一同学习用于视频数据接口的DVP模块,并将其封装成AXI-stream接口便于直接和VDMA IP通信。 DVP_AXI stream IP v1.0使用说明 1.设计概述 •用于cmos传感器视频数据采集,将cmos输出的8位视频数据拼接成RGB 565模式 •AXI_stream主机接口,用于和PS端内存的数据交互 •基于vivado 18.3软件设计 2.模块分析

weixin_41895751的博客 4582

ping的实现和代码分析

ping命令是用来查看网络上另一个主机系统的网络连接是否正常的一个工具。ping命令的工作原理是:向网络上的另一个主机系统发送ICMP报文,如果指定系统得到了报文,它将把报文一模一样地传回给发送者,这有点象潜水艇声纳系统中使用的发声装置。

恰同学少年 1万+

手把手教你用Github提交CVE漏洞(附完整截图流程)

本文提供了在GitHub平台提交CVE漏洞的完整实战指南。从前期准备、目标搜寻与漏洞验证,到撰写规范的GitHub Issue进行披露,最后通过官方渠道完成CVE提交,手把手教你如何将安全研究成果转化为获得国际认可的CVE编号。

weixin_28309571的博客 324

ping 网络状态报警

推荐一些不错的电子书:[url]http://www.memeshu.com[/url] #!/bin/sh cd /data/search/inspect if [ $# -lt 2 ] ; then echo "Usage: sh ping.sh [machine] [timeout] "; exit 0; fi machine=$1; loadValue=$2; ...

iteye_572的博客 615

合成孔径雷达(SAR)的常见工作模式

随着星载SAR技术研究的深入发展,单一的条带模式已经无法满足当今时代的需求,因此许多新的工作模式相继被提出。这些新模式在分辨率和测绘宽度等方面都有所提高,接下来将简要介绍几种常用的工作模式。

m0_51390495的博客 2314

ROS环境下UR机械臂与Realsense相机手眼标定实战指南

本文提供了在ROS环境下,对UR机械臂与Realsense相机进行手眼标定的完整实战指南。详细介绍了从环境搭建、软件包安装、硬件配置到分步数据采集与计算的完整流程,并分享了常见的避坑技巧与精度优化方法,旨在帮助开发者高效、准确地完成标定,为后续的机器人视觉应用奠定坚实基础。

sunny的博客 647

ping代码

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define MAX_PACKET_SIZE 4096 static int max_packet_num = 4; ch

zzran的专栏 2219

Arduino+L298N电机驱动模块避坑指南:从接线到PWM调速的5个常见错误

本文详细解析了使用Arduino与L298N电机驱动模块时,从电源配置、跳线帽使用到PWM调速的5个常见错误与避坑指南。重点阐述了如何正确分离逻辑与电机电源、拔掉ENA/ENB跳线帽以实现PWM调速、理解H桥接线逻辑以控制直流电机正反转,并提供优化代码与散热建议,帮助开发者稳定驱动电机。

rust6ferris的博客 562

python实现ping功能_python实现的ping的代码

把开发过程中较好的代码段做个记录,如下资料是关于python实现的ping的代码,希望对各位朋友有用。#!/usr/bin/env python#coding:utf-8import os, sys, socket, struct, select, time# From /usr/include/linux/icmp.h; your milage may vary.ICMP_ECHO_REQUES...

weixin_39627408的博客 436

【Java基础篇】Java重要特性,JDK,JRE,JVM区别和联系,环境变量

JDK使用时的执行流程: • 开发者视角(需要开发java程序):需要安装JDK a. 首先使用JDK调用Tools&Tool APIs(开发者工具)编写好Java程序--xxx.java b. 再次调用Tools&Tool APIs中的javac.exe(编译程序)来编译.java文件(将java文件编译成字节码.class文件) c. 调用java.exe来启动JRE d. 在JRE上运行JAVA字节码(加载特定的.class文件,调用这个class文件中的main方法

Yaoyao2024的博客 2163

数字电路与逻辑设计实验二 组合逻辑电路

1.组合逻辑电路功能测试 (1)用 2 片 74LS00 组成图 2.1 所示逻辑电路。为便于接线和检查,在图中要注明 芯片编号及各引脚对应的编号。 (2)图中 A、B、C 接逻辑开关,Y1,Y2 接发光管电平显示。 (3)按表 2.3 要求,改变 A、B、C 输入的状态,填表并写出 Y1,Y2 的逻辑表达式。 (4)将运算结果与实验结果进行比较。 2.测试用异或门(74LS86)和与非门组成的半加器的逻辑功能。 根据半加器的逻辑表达式可知,半加 器 Y 是 A、B 的异或,而进位 Z 是 A

欢迎交流学习心得 1277

ping 代码

/* author: zhangzhijian time: 2012-11-14 creater sock must root ping localhost [-n count] */ #include #include #include #include #include #include #include #include #include #include #inc

795

4、接收天线:接收电压、功率和传输系数

本文详细探讨了接收天线的性能参数,包括接收电压、功率和传输系数,通过建立等效电路模型分析接收偶极子的电流和开路电压,并定义电压和功率传输函数。研究揭示了天线长度、工作频率及极化失配对传输性能的影响,并提出了优化接收天线性能的策略,为天线系统的设计与优化提供了理论支持。

ll5678的博客 233

如何在PB中编写PING代码?(改编)

如何在PB中编写PING代码?问题描述:如何在PB中编写PING代码?解决方案:声明外部函数: Function ulong IcmpCreateFile () Library "icmp.dll"Function long IcmpSendEcho (ulong IcmpHandle, ulong DestinationAddress, string RequestD

欢迎来到 Balloonman2002 之家,:) 3521

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

ping命令源代码

内容简介: 编写自己的一个ping程序,可以说是许多人迈出网络编程的第一步吧!!这个ping程序的源代码经过我的修改和调试,基本上可以取代windows中自带的ping程序. 各个模块后都有我的详细注释和修改日志,希望能够对大家的学习有所帮助!! /* 本程序的主要源代码来自MSDN网站, 笔者只是做了一些改进和注释! 另外需要注意的是在Build之前,必须加入ws2_32.lib库文件,否...

qq_42577465的博客 3463

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

python ping_python实现的ping的代码

把开发过程中较好的代码段做个记录,如下资料是关于python实现的ping的代码,希望对各位朋友有用。#!/usr/bin/env python#coding:utf-8import os, sys, socket, struct, select, time# From /usr/include/linux/icmp.h; your milage may vary.ICMP_ECHO_REQUES...

weixin_39676348的博客 130

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Arduino示例代码讲解:Ping

使用Parallax PING)))超声波测距传感器。传感器的+V连接到Arduino的+5V。传感器的GND连接到Arduino的地(GND)。传感器的SIG(信号)连接到Arduino的数字引脚7。// 定义传感器信号引脚为数字引脚7pingPin:定义传感器信号引脚为数字引脚7。setup()

视睿 1353

Android 用代码Ping网络

Android 用代码Ping网络和ping: icmp open socket: Operation not permitted问题

陆仁甲的博客 1853

IPV6下的ping源代码

IPV6下的ping源代码,摘至iputils源代码中 /* * * Modified for AF_INET6 by Pedro Roque * * * * Original copyright notice included bellow */ /* * Copyright (c) 1989 The Regents of the University

Jieen的专栏 6516

用vb来Ping的源代码

 Option Explicit Public Const IP_STATUS_BASE = 11000Public Const IP_SUCCESS = 0Public Const IP_BUF_TOO_SMALL = (11000 + 1)Public Const IP_DEST_NET_UNREACHABLE = (11000 + 2)Public Const IP_DEST_HOST_UN

寒风雨(lanman)的专栏 1931

ping程序C++源代码

C++实现的ping源代码

wq897387的专栏 753

Linux下Ping的实现代码

#include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h> #include <netinet/ip_icmp.h> #include <netdb.h> #define PACKET_SIZE 4096 #define ERROR 0 #define SUCCESS 1 // 效验算法 unsigned short

jaylong35的专栏 5432

W5500 Ping示例代码

W5500 Ping示例代码 去发现同类优质开源项目:https://gitcode.com/ 资源文件介绍 文件名 00_W5500_ping.rar 文件描述 该资源文件包含了STM32驱动W5500以太网模块的入网配置代码,支持通过SPI接口进行配置,并提供了基础的W5500支持文件和示例demo代码。通过该代码,您可以实现STM32与W5500模块的连接,并成功进行ping测试。 主要内容...

gitblog_09769的博客 521

android ping ip 代码,Android执行ping命令检查网络

因为ping要用到网络请求,所以要在AndroidManifest.xml加入网络权限:1、准备好ping命令将IP或域名和一些参数组合成一条ping命令:private String spellPing(String ip) {String countCmd = " -c 4 ";String sizeCmd = " -s 64 ";String timeCmd = " -i 1 ";retur...

weixin_42638139的博客 2326

java代码实现ping ip

public static void main(String[] args) {         Runtime runtime = Runtime.getRuntime(); // 获取当前程序的运行进对象         Process process = null; // 声明处理类对象         String line = null; // 返回行信息         Inp

周涛的博客 1162
上一篇: 平衡树AVLTree的代码
下一篇: Tracert 代码
enjoyeclipse
博客等级 码龄19年 5粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值