微软ping程序源代码完整c版(修正版)

VC++ Ping IP地址  // // Ping.h // #pragma pack(1) #define ICMP_ECHOREPLY 0 #define ICMP_ECHOREQ 8 #define REQ_DATASIZE 32 // Echo 请求数据的大小 class CPing { publi 阅读详情

原文来自icfed的专栏

#pragma pack(4)
#pragma comment(lib, "ws2_32.lib")
#include   "winsock2.h"
#include   "stdlib.h"
#include   "stdio.h"
#define ICMP_ECHO 8
#define ICMP_ECHOREPLY 0
#define ICMP_MIN 8 // minimum 8 byte icmp packet (just header)

/* The IP header */
typedef struct iphdr {
 unsigned int h_len:4; // length of the header
 unsigned int version:4; // Version of IP
 unsigned char tos; // Type of service
 unsigned short total_len; // total length of the packet
 unsigned short ident; // unique identifier
 unsigned short frag_and_flags; // flags
 unsigned char ttl;
 unsigned char proto; // protocol (TCP, UDP etc)
 unsigned short checksum; // IP checksum
 unsigned int sourceIP;
 unsigned int destIP;
}IpHeader;

//
// ICMP header
//

typedef struct icmphdr {
 BYTE i_type;
 BYTE i_code; /* type sub code */
 USHORT i_cksum;
 USHORT i_id;
 USHORT i_seq;
 /* This is not the std header, but we reserve space for time */
 ULONG timestamp;
}IcmpHeader;

#define STATUS_FAILED 0xFFFF
#define DEF_PACKET_SIZE    32
#define DEF_PACKET_NUMBER  4    /* 发送数据报的个数 */
#define MAX_PACKET 1024

#define xmalloc(s) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(s))
#define xfree(p) HeapFree (GetProcessHeap(),0,(p))
void fill_icmp_data(char *, int);
USHORT checksum(USHORT *, int);
int decode_resp(char *,int ,struct sockaddr_in *);
void Usage(char *progname){
 fprintf(stderr,"Usage:/n");
 fprintf(stderr,"%s [number of packets] [data_size]/n",progname);
 fprintf(stderr,"datasize can be up to 1Kb/n");
 ExitProcess(STATUS_FAILED);
}


int main(int argc, char **argv){
 WSADATA wsaData;
 SOCKET sockRaw;
 struct sockaddr_in dest,from;
 struct hostent * hp;
 int bread,datasize,times;
 int fromlen = sizeof(from);
 int timeout = 1000;
 int statistic = 0;  /* 用于统计结果 */ 
 char *dest_ip;
 char *icmp_data;
 char *recvbuf;
 unsigned int addr=0;
 USHORT seq_no = 0;
 if (WSAStartup(MAKEWORD(2,1),&wsaData) != 0){
  fprintf(stderr,"WSAStartup failed: %d/n",GetLastError());
  ExitProcess(STATUS_FAILED);
 }
 if (argc <2 ) {
  Usage(argv[0]);
 }
 sockRaw = WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL, 0,WSA_FLAG_OVERLAPPED);
 //
 //注:为了使用发送接收超时设置(即设置SO_RCVTIMEO, SO_SNDTIMEO),
 //    必须将标志位设为WSA_FLAG_OVERLAPPED !
 //
 if (sockRaw == INVALID_SOCKET) {
  fprintf(stderr,"WSASocket() failed: %d/n",WSAGetLastError());
  ExitProcess(STATUS_FAILED);
 }
 bread = setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,
      sizeof(timeout));
 if(bread == SOCKET_ERROR) {
  fprintf(stderr,"failed to set recv timeout: %d/n",WSAGetLastError());
  ExitProcess(STATUS_FAILED);
 }
 timeout = 1000;
 bread = setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,
      sizeof(timeout));
 if(bread == SOCKET_ERROR) {
  fprintf(stderr,"failed to set send timeout: %d/n",WSAGetLastError());
  ExitProcess(STATUS_FAILED);
 }
 memset(&dest,0,sizeof(dest));
 hp = gethostbyname(argv[1]);
 if (!hp){
  addr = inet_addr(argv[1]);
 }
 if ((!hp) && (addr == INADDR_NONE) ) {
  fprintf(stderr,"Unable to resolve %s/n",argv[1]);
  ExitProcess(STATUS_FAILED);
 }
 if (hp != NULL)
  memcpy(&(dest.sin_addr),hp->h_addr,hp->h_length);
 else
  dest.sin_addr.s_addr = addr;

 if (hp)
  dest.sin_family = hp->h_addrtype;
 else
  dest.sin_family = AF_INET;

 dest_ip = inet_ntoa(dest.sin_addr);

 //
 //  atoi函数原型是: int atoi( const char *string );
 //  The return value is 0 if the input cannot be converted to an integer !
 //
 if(argc>2)
 {
  times=atoi(argv[2]);
  if(times == 0)
   times=DEF_PACKET_NUMBER;
 }
 else
  times=DEF_PACKET_NUMBER;

 if (argc >3)
 {
  datasize = atoi(argv[3]);
  if (datasize == 0)
   datasize = DEF_PACKET_SIZE;
  if (datasize >1024)   /* 用户给出的数据包大小太大 */
  {
    fprintf(stderr,"WARNING : data_size is too large !/n");
    datasize = DEF_PACKET_SIZE;
  }
 }
 else
  datasize = DEF_PACKET_SIZE;

 datasize += sizeof(IcmpHeader);
 icmp_data = (char*)xmalloc(MAX_PACKET);
 recvbuf = (char*)xmalloc(MAX_PACKET);
 if (!icmp_data) {
  fprintf(stderr,"HeapAlloc failed %d/n",GetLastError());
  ExitProcess(STATUS_FAILED);
 }

 memset(icmp_data,0,MAX_PACKET);
 fill_icmp_data(icmp_data,datasize);
 //
 //显示提示信息
 //
 fprintf(stdout,"/nPinging %s ..../n/n",dest_ip);

 for(int i=0; i<times; i++){                       //改正部分
  int bwrote;
  ((IcmpHeader*)icmp_data)->i_cksum = 0;
  ((IcmpHeader*)icmp_data)->timestamp = GetTickCount();
  ((IcmpHeader*)icmp_data)->i_seq = seq_no++;
  ((IcmpHeader*)icmp_data)->i_cksum = checksum((USHORT*)icmp_data,datasize);
  bwrote = sendto(sockRaw,icmp_data,datasize,0,(struct sockaddr*)&dest,sizeof(dest));
  if (bwrote == SOCKET_ERROR){
   if (WSAGetLastError() == WSAETIMEDOUT) {
    printf("Request timed out./n");
    continue;
   }
   fprintf(stderr,"sendto failed: %d/n",WSAGetLastError());
   ExitProcess(STATUS_FAILED);
  }
  if (bwrote < datasize ) {
   fprintf(stdout,"Wrote %d bytes/n",bwrote);
  }
  
  bread = recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(struct sockaddr*)&from,&fromlen);
  if (bread == SOCKET_ERROR){
   if (WSAGetLastError() == WSAETIMEDOUT) {
    printf("Request timed out./n");
    continue;
   }
   fprintf(stderr,"recvfrom failed: %d/n",WSAGetLastError());
   ExitProcess(STATUS_FAILED);
  }
  if(!decode_resp(recvbuf,bread,&from))
   statistic++; /* 成功接收的数目++ */
  Sleep(1000);
 }

 /*
 Display the statistic result
 */
 fprintf(stdout,"/nPing statistics for %s /n",dest_ip);
 fprintf(stdout,"    Packets: Sent = %d,Received = %d, Lost = %d (%2.0f%% loss)/n",times,
   statistic,(times-statistic),(float)(times-statistic)/times*100);

 WSACleanup();
 return 0;
}


/*
The response is an IP packet. We must decode the IP header to locate
the ICMP data
*/
int decode_resp(char *buf, int bytes,struct sockaddr_in *from) {
 IpHeader *iphdr;
 IcmpHeader *icmphdr;
 unsigned short iphdrlen;
 iphdr = (IpHeader *)buf;
 iphdrlen = (iphdr->h_len) * 4 ; // number of 32-bit words *4 = bytes
 if (bytes < iphdrlen + ICMP_MIN) {
  printf("Too few bytes from %s/n",inet_ntoa(from->sin_addr));
 }
 icmphdr = (IcmpHeader*)(buf + iphdrlen);
 if (icmphdr->i_type != ICMP_ECHOREPLY) {
  fprintf(stderr,"non-echo type %d recvd/n",icmphdr->i_type);
  return 1;
 }
 if (icmphdr->i_id != (USHORT)GetCurrentProcessId()) {
  fprintf(stderr,"someone else''s packet!/n");
  return 1;
 }
 printf("%d bytes from %s:",bytes, inet_ntoa(from->sin_addr));
 printf(" icmp_seq = %d. ",icmphdr->i_seq);
 printf(" time: %d ms ",GetTickCount()-icmphdr->timestamp);
 printf("/n");
 return 0;
 }

 USHORT checksum(USHORT *buffer, int size) {
 unsigned long cksum=0;
 while(size >1) {
  cksum+=*buffer++;
  size -=sizeof(USHORT);
 }
 if(size) {
  cksum += *(UCHAR*)buffer;
 }
 cksum = (cksum >> 16) + (cksum & 0xffff);
 cksum += (cksum >>16);
 return (USHORT)(~cksum);
}
 

/*
Helper function to fill in various stuff in our ICMP request.
*/
void fill_icmp_data(char * icmp_data, int datasize){
 IcmpHeader *icmp_hdr;
 char *datapart;
 icmp_hdr = (IcmpHeader*)icmp_data;
 icmp_hdr->i_type = ICMP_ECHO;
 icmp_hdr->i_code = 0;
 icmp_hdr->i_id = (USHORT)GetCurrentProcessId();
 icmp_hdr->i_cksum = 0;
 icmp_hdr->i_seq = 0;
 datapart = icmp_data + sizeof(IcmpHeader);

 //
 // Place some junk in the buffer.
 //
 memset(datapart,'E', datasize - sizeof(IcmpHeader));   //改正部分
}

windows和linux ping一个c段 windows和linux ping一个c段windowslinux pingc段和b段是一样的 windows for /l %%i in (10,1,10) do for /l %%n in (1,1,254) do echo ping 192.168.%%i.%%n -n 1|find /i "TTL=" linux #!/bin/bash ip=192.168 for addr16 in $(seq 1 254); do for addr24 in $(seq 1 254); do pin 阅读详情

相关推荐

VC++实现Ping功能(附源码)

我们有时在开发中需要这么一个功能,在连接服务端之前,想知道网络到底是不是好的, 尤其是wifi这种网络环境, wifi是好的,但就是连接不上网络,这时我们需要一个ping的功能,检测网络是不是好的! ping的过程是向目的IP发送一个type=8的ICMP响应请求报文,目标主机收到这个报文之后,会向源IP(发送方,我)回复一个type=0的ICMP响应应答报文。 Ping程序实现步骤 创建类型为SOCK_RAW的一个套接字,同时设定协议IPPROTO_ICMP。 创建并初始化ICMP头..

Keivin 1869

vc实现ping

//ping.h #ifndef _CPING_H_ #define _CPING_H_ #include <Winsock2.h> #include <Windows.h> #pragma pack(1) #define ICMP_ECHOREPLY 0 #define ICMP_ECHOREQ 8 #define REQ_DATASIZE 32 ...

weixin_30443731的博客 688

使用VC++调用IcmpSendEcho函数实现对远程地址的Ping检测

如果函数调用成功,我们打印"Ping succeeded.",并释放ReplyBuffer和Icmp句柄,然后返回true。在VC++中,可以使用IcmpSendEcho函数来实现对远程地址的Ping检测。本文将介绍如何使用VC++编写代码,调用IcmpSendEcho函数来执行Ping操作。通过这个示例,你可以在自己的VC++项目中使用这个函数来执行Ping操作,并根据需要进行相应的处理。在主函数中,我们传入远程地址(这里使用本地回环地址127.0.0.1作为示例),并调用Ping函数进行Ping检测。

CyberWarpX的博客 260

ping小程序

#include #include #include #pragma comment(lib, "ws2_32")typedef struct tagIPINFO{ u_char Ttl;    // Time To Live u_char Tos;    // Type Of Service u_char IPFlags;   // IP flags u_char OptSize;   //

龙宇网的专栏 1952

用VC实现PING操作,很好很强大

该程序用VC++6.0编制,实现了ping 操作

VC++ping命令

VC++,MFC,ping命令程序源代码

VC封装Ping命令的实现

本文给出了网络编程中封装ping命令的一种实现方式,能够在程序启动后一直ping目标网络。

大道至简,知易行难 4063

VC编写PING命令

VC编写PING命令,可以实现ping主机,并回显

VC++控制台下ping功能的代码

http://read.pudn.com/downloads80/sourcecode/windows/network/307147/Ping/Ping.cpp__.htm // #pragma pack(4) // #pragma comment(lib, "ws2_32.lib") // #include "stdafx.h" // #include // #inclu

ilikehigame的专栏 2308

ping命令VC++实现

用vc++实现ping命令,使用网络套接字实现icmp协议。

tmux + Claude Code 远程开发指南:从 WSL 配置到断线无忧

远程开发中,SSH 连接中断常导致后台任务丢失,这是困扰开发者的经典难题。tmux 作为终端复用器,通过将进程挂在常驻会话中,使其脱离 SSH 连接独立运行,从根本上解决了断线导致的任务终止问题。Claude Code 等 AI 编程代理需要长时间运行并保持交互上下文,恰好依赖这种会话持久化能力。结合 Windows Subsystem for Linux 提供类 Unix 环境,开发者可在 Windows 上实现稳定的远程开发工作流。本文将完整介绍从 WSL 环境配置、tmux 会话管理,到与 Claud

weixin_30423065的博客 348

PING命令 VC源代码

/******************************************************************************\ * ping.c - Simple ping utility using SOCK_RAW * * This is a part of the Microsoft Source Code Samples. * Copyri

wangjieest的专栏 2373

AI Agent评估:指标、策略与最佳实践

AI智能体正逐渐融入到各个领域,从日常的对话助手到复杂的工作流程自动化,其应用范围不断拓展。然而,确保这些智能体能够可靠、高效地完成任务至关重要,这就使得AI智能体评估成为了人工智能发展过程中不可或缺的一环。本文将深入探讨AI智能体评估的指标、策略以及最佳实践,为读者全面解读这一关键领域。

llm_way的博客 3498

VC模拟ping发送ICMP数据包

张越的那本《Visual c++网络程序设计实例详解》很好,他的代码写得很漂亮!         网络编程方面的书籍,那是遗弃许久。这一段时间再次拾起,以补不足!         这是他第一章的实例,模拟ping来发送ICMP数据包:   1、程序源码 [cpp] view plaincopyprint? //

zqf_office的专栏 1586

dmx512协议c语言编程,DMX512协议+c程序代码.pdf

DMX512 协议1.协议简介DMX 是Digital MultipleX 的缩写 ,意为多路数字传输。DMX512 控制协议是美国舞台灯光协会(USITT)于1990 年发布的灯光控制器与灯具设备进行数据传输的工业标准 ,全称是 USITT DMX512(1990) ,包括电气特性、数据协议、数据格式等方面的内容。2. 电气特性和物理层2.1. 电气特...

weixin_39928993的博客 2543

【一起学UniGUI】--UniGUI的部署选项(5)

uniGUI支持Windows平台下所有主要部署选项。 1.Standalone Server (独立服务器) 最简单的部署方法是独立服务器。在这种模式下,应用程序服务器像桌面应用程序一样直接运行。它也是用于调试应用程序的模式。运行应用程序可执行文件后(它是一个EXE文件),它将最小化到托盘图标,并运行到用户手动终止为止。见下图: 一个独立的应用程序可以...

5777

c语言ping命令windows,Windows C语言 icmp ping命令探测主机存活 笔记

之前在VS2015 2017 2019一直编译不通过,不知道是一些什么奇奇怪怪的问题,但过了几天,编译又成功了,很奇怪,但至少目前是没问题的,先贴一下MSDN上面给的示例代码吧#include#include#include#include#pragmacomment(lib,"iphlpapi.lib")#pragmacomment(lib,"ws2_32.lib")int__...

weixin_42471893的博客 792

2026年AI编程工作流实战:Claude Code与Open Code深度对比

AI编程已从代码生成工具升级为IDE级智能工作流核心能力。其本质是将大语言模型深度嵌入开发环境,通过语义理解、上下文感知与行动闭环重构传统编码范式。Claude Code以企业级知识图谱和双轨Code Review为代表,强调合规性、可审计与深度集成;Open Code则依托Skill可组合性、本地优先模型与ocp协议,实现开源驱动的灵活扩展。二者共同推动IDE从‘编辑器’进化为‘数字搭档’——能理解RFC文档、记住PR评论、自动补全带重试的fetch逻辑,并在Promise链发呆时一键重构为async/a

weixin_33739523的博客 464

Windows网络编程 の 原始套接字学习笔记ICMP

  原始套接字学习笔记 由于原始套接字能够对基层传输机制加以控制,所以存在一定的潜在的安全漏洞,因此在WIN NT下只有“Administrators”组的成员,才有权创建类型为SOCK_RAW的原始套接字,但是在NT中可以通过修改注册表绕过这一限制,能够达到让系统禁制对原始套接字的安全检查 方法如下:注册表中创建如下变量 并设置为1(DWORD类型)HKEY_

Mr.Out的专栏 2026

告别MRT!用ArcGIS脚本批量处理MODIS数据,从HDF到NDVI/ET成品图全流程(附Python代码)

本文详细介绍了使用ArcGIS Python脚本自动化处理MODIS数据的全流程,从HDF文件提取到生成NDVI/ET成品图。通过优化子数据集提取、智能镶嵌策略和投影转换等核心步骤,大幅提升处理效率,告别传统MRT工具的手工操作。附带的Python代码可直接应用于实际项目,特别适合批量处理大规模遥感数据。

weixin_30872337的博客 220

Delphi开发者必备:CEF4Delphi跨平台浏览器嵌入实战指南(含Lazarus适配)

本文详细介绍了Delphi开发者如何利用CEF4Delphi实现跨平台浏览器嵌入,包括环境配置、Lazarus适配、ARM架构优化及Firemonkey集成等实战技巧。通过Chromium引擎的强大功能,开发者可以轻松为传统桌面应用添加现代浏览器特性,提升多平台开发效率。

weixin_29233333的博客 226

聊聊实现C++跨平台ping函数及ICMP请求回显数据包解析

ping我们经常使用,大多数的时候是在命令行ping下IP地址,然后一堆输出。 程序中有时候也会用ping函数,那么ping是如何实现的呢。 计算机网络告诉我们,ping函数是基于ICMP协议实现的,而ICMP协议又是基于IP协议弄的(ICMP作为IP协议的数据部分传输)。 ping通过ICMP协议中的类型8和代码0来搞的,这个类型和代码的组合在ICMP协议中表示请求回显。如果能正常回显,那么返回...

FlushHip 4077

大模型技术全景与核心概念解析:从基础原理到AI智能体架构(实时更新中)

本文系统解析了大模型技术的核心概念与架构。首先介绍了LLM(大语言模型)、LLMOps(模型运维)、AIGC(生成内容)、AGI(通用AI)等基础概念,重点阐述了大模型的工作原理,包括预处理、推理和后处理三个阶段。深入讲解了Token分词、FLOPs计算、Embedding向量表示等关键技术,并分析了LoRA微调、MoE架构等前沿方法。文章还探讨了AI智能体的发展前景,为理解大模型技术提供了全景视角。

算法工程师 1236

ICMP报文详解之ping实现

ping是向网络主机发送ICMP回显请求(ECHO_REQUEST)分组,是TCP/IP协议的一部分。主要可以检查网络是否通畅或者网络连接速度快慢,从而判断网络是否正常。 ping命令底层使用的是ICMP,ICMP报文封装在ip包里。它是一个对IP协议的补充协议,允许主机或路由器报告差错情况和异常状况。 ICMP报文格式和各个字段的含义 ...

chen1415886044的博客 2万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

ping扫描c段主机shell脚本(超快)

shell脚本代码原理代码解释运行 shell脚本 Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比Windows下的批处理更强大,比用其他编程程序编辑的程序效率更高,它使用了Linux/Unix下的命令。 代码 #!/bin/bash if [ "$1" == "" ] then echo "You forgot an IP address!" echo "Syntax: ..

Bu2n的博客 2211

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Windows下C语言实现计算机网络底层Ping功能

一、在Windows环境下,实现ping(即发送一个ICMP的echo报文并对目标返回的回应报文进行正确的解析)二、ICMP(Internet Control Message Protocol,网际控制协议),它允许主机或路由器报告差错情况和提供有关异常情况的报告。ICMP提供的功能:错误诊断、拥塞控制、路径控制和查询服务如当一个分组无法到达目的站点或TTL超时后,路由器就会丢弃此分组,并向源站点返

g15827636417的博客 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

上一篇: SQLSERVER远程备份、恢复
下一篇: jsp开发所需要的eclipse插件(lomboz、tomcatplugin)及其安装、配置方法
ahuu
博客等级 码龄24年 9粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值