windows中多ping网络ICMP

news2024/11/14 13:25:54

之前没搞过ICMP,第一次弄,遇到好多坑,其中在接收ICMP消息时无法指定ip这个坑困扰了好久,最后在网上找到一种解决方法;直接看效果吧!!

其中我获取ip状态直接扔到线程池里面处理的 

struct DevicePingMsg
{
	DevicePingMsg()
	{
		ipStr = "";
		sendPacketNum = 0;
		receivePacketNum = 0;
		lossPacketNum = 0;
		lossPacketRate = "";
		minRespondTime = 0;
		maxRespongTime = 0;
		ttl = 0;
	}
	/// ip地址
	QString		ipStr;
	/// 发包数 
	int			sendPacketNum;
	/// 收包数
	int			receivePacketNum;
	/// 丢包数
	int			lossPacketNum;
	/// 丢包率
	QString		lossPacketRate;
	/// 最小响应时间
	int			minRespondTime;
	/// 最大响应时间
	int			maxRespongTime;
	/// TTL
	int			ttl;
};

typedef struct {
	unsigned char Ttl;                         // Time To Live
	unsigned char Tos;                         // Type Of Service
	unsigned char Flags;                       // IP header flags
	unsigned char OptionsSize;                 // Size in bytes of options data
	unsigned char *OptionsData;                // Pointer to options data
} IP_OPTION_INFORMATION, *PIP_OPTION_INFORMATION;

typedef struct {
	DWORD Address;                             // Replying address
	unsigned long  Status;                     // Reply status
	unsigned long  RoundTripTime;              // RTT in milliseconds
	unsigned short DataSize;                   // Echo data size
	unsigned short Reserved;                   // Reserved for system use
	void *Data;                                // Pointer to the echo data
	IP_OPTION_INFORMATION Options;             // Reply options
} IP_ECHO_REPLY, *PIP_ECHO_REPLY;
void PingDevice::PingProc(QString ipStr, void *pUser)
{
	typedef HANDLE(WINAPI* pfnHV)(VOID);
	typedef BOOL(WINAPI* pfnBH)(HANDLE);
	typedef DWORD(WINAPI* pfnDHDPWPipPDD)(HANDLE, DWORD, LPVOID, WORD, PIP_OPTION_INFORMATION, LPVOID, DWORD, DWORD);
	pfnHV pIcmpCreateFile;
	pfnBH pIcmpCloseHandle;
	pfnDHDPWPipPDD pIcmpSendEcho;

	_hIcmp = LoadLibrary(TEXT("ICMP.DLL"));
	if (NULL == _hIcmp)
	{
		return;
	}

	pIcmpCreateFile = (pfnHV)GetProcAddress(_hIcmp, "IcmpCreateFile");
	pIcmpCloseHandle = (pfnBH)GetProcAddress(_hIcmp, "IcmpCloseHandle");
	pIcmpSendEcho = (pfnDHDPWPipPDD)GetProcAddress(_hIcmp, "IcmpSendEcho");
	if ((pIcmpCreateFile == 0) || (pIcmpCloseHandle == 0) || (pIcmpSendEcho == 0))
	{
		return;
	}

	HANDLE hIP = pIcmpCreateFile();
	if (hIP == INVALID_HANDLE_VALUE)
	{
		return;
	}

	char acPingBuffer[64];
	memset(acPingBuffer, '\xAA', sizeof(acPingBuffer));
	PIP_ECHO_REPLY pIpe = (PIP_ECHO_REPLY)GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, sizeof(IP_ECHO_REPLY) + sizeof(acPingBuffer));
	if (pIpe == 0)
	{
		return;
	}
	pIpe->Data = acPingBuffer;
	pIpe->DataSize = sizeof(acPingBuffer);

	DWORD	  dwElapsed = 0;

	int sendNum = 0;
	int receiveNum = 0;
	int lostNum = 0;
	int maximum = 0;
	int minimum = 0;
	m_bRuning = true;
	int	timeElapsed;

	DialogDeviceMorePing* _this = static_cast<DialogDeviceMorePing*>(pUser);
	if (!_this)
		return;

	while (m_bRuning)
	{
		struct hostent* phe;
		if ((phe = gethostbyname(ipStr.toStdString().data())) == 0)
		{
			dwElapsed = -1;
		}
		sendNum++;
		auto start = std::chrono::system_clock::now();
		DWORD dwStatus = pIcmpSendEcho(hIP, *((DWORD*)phe->h_addr_list[0]),
			acPingBuffer, sizeof(acPingBuffer), NULL, pIpe,
			sizeof(IP_ECHO_REPLY) + sizeof(acPingBuffer), 10);
		if (dwStatus != 0)
		{
			dwElapsed = pIpe->RoundTripTime;
		}
		else
		{
			if (11010 == GetLastError())
			{
				dwElapsed = -1;
			}
		}

		if (dwElapsed != -1)
		{
			receiveNum++;
			auto end = std::chrono::system_clock::now();
			auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);

			DevicePingMsg pingMsg;
			pingMsg.ttl = pIpe->Options.Ttl;

			pingMsg.ipStr = ipStr;
			pingMsg.sendPacketNum = sendNum;
			pingMsg.lossPacketNum = lostNum;
			pingMsg.receivePacketNum = receiveNum;
			float lossRate = (lostNum * 1.0) / (sendNum * 1.0);
			pingMsg.lossPacketRate = QString::number(lossRate, 'f', 2);
			timeElapsed = dwElapsed;
			if (timeElapsed > maximum)
				maximum = timeElapsed;
			if (timeElapsed < minimum)
				minimum = timeElapsed;
			pingMsg.minRespondTime = minimum;
			pingMsg.maxRespongTime = maximum;
			_this->UpdatePingMsg(pingMsg, false);

		}
		else
		{
			DevicePingMsg pingMsg;
			lostNum++;
			pingMsg.ttl = pIpe->Options.Ttl;
			pingMsg.ipStr = ipStr;
			pingMsg.sendPacketNum = sendNum;
			pingMsg.lossPacketNum = lostNum;
			pingMsg.receivePacketNum = receiveNum;
			float lossRate = (lostNum * 1.0) / (sendNum * 1.0);
			pingMsg.lossPacketRate = QString::number(lossRate, 'f', 2);
			_this->UpdatePingMsg(pingMsg, true);

		}

		std::this_thread::sleep_for(std::chrono::milliseconds(1000));
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2125111.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenAI新模型“Strawberry“蓄势待发:会思考的AI即将登场?

OpenAI新模型"Strawberry"蓄势待发&#xff1a;会思考的AI即将登场&#xff1f; OpenAI的神秘大模型"草莓"&#xff08;Strawberry&#xff0c;之前称为Q*&#xff09;可能要提早亮相了。这款AI不仅能思考&#xff0c;还可能彻底改变我们与人工智能互动的方…

果蔬识别系统性能优化之路(三)

目录 前情提要遗留问题 解决方案优化查询速度优化ivf初始化的速度 下一步 前情提要 果蔬识别系统性能优化之路&#xff08;二&#xff09; 遗留问题 优化同步速度&#xff0c;目前大约30秒&#xff0c;不是一个生产速度 这次来解决遗留问题 通过console&#xff0c;发现两个…

【F178】基于Springboot+vue实现的智能无人仓库管理

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 项目描述 互联网发展至今&#xff0c;无论是其理论还是技术都已经…

揭秘数据库性能飞跃的秘密:深入理解索引与执行计划的艺术

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 座右铭&#xff1a; 云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元 个人主页&#xff1a;团儿.-CSDN博客 目录 前言&#…

2024最新版超级全的Python基础知识

数据类型和变量 Python使用缩进来组织代码块,一般使用4个空格的缩进.使用#来注释一行,其他每一行都是一个语句,当语句以冒号:结尾时,缩进的语句视为代码块.Python对大小写敏感 1.1整数 Python可以处理任意大小的整数,包括负整数,写法与数学上写法一致,例如&#xff1a;-100.如…

项目管理软件的技术深度剖析:从架构到创新的全面探索

各位技术小伙伴们&#xff0c;今天咱们跟随猴哥聊聊一个既熟悉又略带神秘的话题——项目管理软件。在快节奏的现代商业环境中&#xff0c;项目管理就像是企业运作的润滑剂&#xff0c;而项目管理软件&#xff0c;就是那把让一切井然有序的神器。不过&#xff0c;别看它平时默默…

大模型sft评估指标方案

大模型sft评估一直都是一个让人头疼的问题&#xff0c;那么如何进行sft评估呢&#xff1f; 一共有两类方案 第一类&#xff1a;用另一个AI或者人类 对模型答案进行打分 可以是竞技场模式&#xff0c;也可以是离线打分模式 打分可以用一些权威的榜单&#xff0c;例如 super…

AI芯片国产化率100%!运营商最大单集群智算中心投产

8月30日&#xff0c;中国移动建成运营商最大单集群智算中心——中国移动智算中心&#xff08;哈尔滨&#xff09;&#xff0c;并正式投产使用&#xff0c;将为全国的科技创新与产业升级带来强大助力。 该智算中心部署超1.8万张AI加速卡&#xff0c;AI芯片国产化率达100%&#x…

【吊打面试官系列-Redis面试题】都有哪些办法可以降低 Redis 的内存使用情况呢?

大家好&#xff0c;我是锋哥。今天分享关于【都有哪些办法可以降低 Redis 的内存使用情况呢&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 都有哪些办法可以降低 Redis 的内存使用情况呢&#xff1f; 如果你使用的是 32 位的 Redis 实例&#xff0c;可以好好利…

佰朔资本:股票市场牛熊是什么意思,熊市怎么找投资机会?

股票商场中的牛市&#xff0c;也被称为多头商场&#xff0c;指的是股票价格长时刻呈上升趋势的股票商场&#xff0c;后续广泛看涨的情况。 股票商场中的熊市&#xff0c;也被称为空头商场&#xff0c;指股票的价格长时刻呈下降趋势的股票商场&#xff0c;后续广泛看跌的情况。…

计算机常见网络协议分析(1)

1.ppp协议 &#xff09;流程&#xff1a;五个阶段 链路不可用阶段dead 链路建立阶段established 认证阶段authentiate 网络层协议阶段network 链路终止阶段terminate &#xff09;帧格式: Flags&#xff1a;帧定界&#xff0c;表示帧开始和结束&#xff0c;一字节&#…

实验十一 Java的网络应用

实验目的及要求 目的&#xff1a;熟悉java中网络通讯的基本原理及简单网络程序的开发。 内容&#xff1a;1.编写使用ServerSocket创建服务器端程序&#xff1b; 2.编写使用Socket创建客户器端程序&#xff1b; 3.验证使用套接字实现网络通信的方法。 二、实验环境 计算机…

Codeforces Round 969 (Div. 2) (A~D)

文章目录 A. Doras Set思路code B. Index and Maximum Value思路code C. Dora and C思路code D. Iris and Game on the Tree思路code Codeforces Round 969 (Div. 2) A. Dora’s Set 思路 签到题&#xff0c;把玩一下样例不难发现&#xff1a; 对于 [ l , r ] [l,r] [l,r] …

MVC架构的JSP快速学习(一)

目录 服务相关配置 模型介绍 基础依赖 模型图(抽象) 项目结构 控制器编写 服务相关配置 1. Tomcat配置 http://t.csdnimg.cn/9rILV 2. Maven配置 http://t.csdnimg.cn/REKu9 3. Idea配置 tomcat maven 模型介绍 虽然JSP本身不强制使用MVC&#xff0c;但它通常与Serv…

【MySQL】敏感数据加密后如何模糊查询?

往期文章&#xff1a; 【MySQL】索引 【MySQL】索引底层的数据结构 BTree 【MySQL】SQL语句执行流程 【MySQL】order by 的排序策略 【MySQL】explain 执行计划各字段解析 一、前言 在日常开发中&#xff0c;我们通常需要对敏感数据进行加密存储&#xff0c;如&#xff1a…

封装一个 Vue 3 流程线可视化组件

这个组件展示了一系列带有节点和箭头连接的流程线&#xff0c;并具备不同风险等级的样式和动画效果&#xff0c;非常适合大屏展示项目。 功能概述 这个流程线组件具备以下功能&#xff1a; 动态渲染&#xff1a;根据传入的数据&#xff0c;组件可以自动生成节点和箭头。风险…

后端面试经典问题汇总

后端面试经典问题汇总 后端开发在现代互联网应用中扮演着关键角色&#xff0c;涉及的数据处理、业务逻辑和系统性能等方面在面试中常常会被深入考察。本文将总结一些后端面试中常见的经典问题&#xff0c;并给出简单的解答思路。 1. HTTP 协议 问题&#xff1a;请解释 HTTP …

Linux:五种IO模型

1&#xff1a;五种IO模型 1&#xff1a;阻塞IO 阻塞IO: 在内核将数据准备好之前,系统调用会一直等待.所有的套接字,默认 都是阻塞方式。 2&#xff1a;非阻塞 IO 非阻塞 IO: 如果内核还未将数据准备好, 系统调用仍然会直接返回, 并且返回EWOULDBLOCK 错误码。 非阻塞 IO 往往需…

Centos7.9部署Gitlab-ce-16.9

一、环境信息 软件/系统名称版本下载地址备注Centos77.9.2009https://mirrors.nju.edu.cn/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.isogitlab-cegitlab-ce-16.9.1https://mirror.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-16.9.1-ce.0.el7.x86_64.rpm…

4款免费录屏工具,哪款更实用?

作为一个经常需要录制教程和游戏视频的UP主&#xff0c;我尝试过市面上不少录屏工具。今天&#xff0c;我就来分享一下我使用过的四款软件录制全屏时的体验感受&#xff0c;看看哪款软件的表现更胜一筹。 一、福昕录屏大师 网址&#xff1a;https://www.foxitsoftware.cn/REC/…