QT 在Windows下實現ping功能(ICMP)

前言

很多時候,我們可能會圖省事直接調用系統中的ping命令,但這是很不科學的~

廢話不多說,直接上代碼..

.pro文件

在.pro文件末尾添加一行:

LIBS += -liphlpapi -lws2_32

.h文件

在.h文件中加入:

#include <QDebug>
#include <winsock2.h>
#include <iphlpapi.h>
#include <icmpapi.h>
#include <ws2tcpip.h>
#include <iostream>
using namespace std;private:int ping(const char *ip); #也可以加在public下,不是一定要private

.cpp文件:?

// ping函數
int Widget::ping(const char *ip){//通常使用MAKEWORD宏來指定版本,如MAKEWORD(2, 2)表示使用Winsock 2.2版本。WSADATA wsaData;//WSAStartup函數用于初始化Winsock庫,并指定Winsock庫的版本。這個函數需要在使用Winsock庫的其他函數之前調用,而在程序結束時,你需要調用WSACleanup函數來釋放Winsock庫的資源。if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){qDebug()<<"Error1:"<<WSAGetLastError();return -1;}// 創建socketSOCKET sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);if (sock == INVALID_SOCKET){qDebug()<<"Error2:"<<WSAGetLastError();return -2;}//設置目的地址SOCKADDR_IN dest;dest.sin_family = AF_INET;dest.sin_addr.s_addr = inet_addr(ip);//創建ICMP數據包const int packet_size = 32; //數據包大小,取值范圍 0-65507char packet[packet_size];memset(packet, 0, packet_size); //memset函數通常用于初始化一段內存空間,或者將一段內存空間清空。這句的作用是將packet指向的內存空間清空,以便后續的代碼可以使用這段內存空間來存儲ICMP報文//創建icmp句柄ICMP_ECHO_REPLY reply;HANDLE icmp_handle = IcmpCreateFile();if (icmp_handle == INVALID_HANDLE_VALUE){qDebug()<<"Error3:"<<GetLastError();return -3;}DWORD reply_size = packet_size + 28; //接收到的ICMP回復數據的大小。+28等同于:+sizeof(reply)//發送ICMP數據包int status = IcmpSendEcho(icmp_handle, dest.sin_addr.s_addr, packet, packet_size, NULL, &reply, reply_size, 2000);if (status == 0) //這里status == 0 表示執行失敗,要查看錯誤碼可以查看: reply.Status{qDebug()<<"Error4:"<<GetLastError();return -4;}// Print the responseqDebug()<<"延時:" << reply.RoundTripTime; //查看延時qDebug()<<"包大小:" << reply.DataSize; //查看數據包大小qDebug()<<"TTL值:" << (int)reply.Options.Ttl; //查看ttl值WSACleanup(); //釋放WSAStartupreturn reply.RoundTripTime; //返回延時
}

ping函數調用方法示例:

方法一:

ping("192.168.1.1");

方法二:

QString ip = "192.168.1.1";
ping(ip.toUtf8());

如果要重復執行,可以通過循環重復調用ping函數..

reply.Status狀態碼:

常量名

含義

IP_SUCCESS

0

狀態是成功。

IP_BUF_TOO_SMALL

11001

答復緩沖區太小。

IP_DEST_NET_UNREACHABLE

11002

目標網絡不可達。

IP_DEST_HOST_UNREACHABLE

11003

目標主機不可達。

IP_DEST_PROT_UNREACHABLE

11004

目的地的協議是遙不可及。

IP_DEST_PORT_UNREACHABLE

11005

目標端口不可達。

IP_NO_RESOURCES

11006

IP資源不足。

IP_BAD_OPTION

11007

指定了錯誤的IP選項。

IP_HW_ERROR

11008

一個硬件錯誤。

IP_PACKET_TOO_BIG

11009

包太大。

IP_REQ_TIMED_OUT

11010

請求超時。

IP_BAD_REQ

11011

一個壞的請求。

IP_BAD_ROUTE

11012

一個糟糕的路線。

IP_TTL_EXPIRED_TRANSIT

11013

在傳輸過程中的生存時間(TTL)的過期。

IP_TTL_EXPIRED_REASSEM

11014

在碎片重組過程中的生存時間過期。

IP_PARAM_PROBLEM

11015

一個參數的問題。

IP_SOURCE_QUENCH

11016

數據報到達太快,處理和數據報可能被丟棄。

IP_OPTION_TOO_BIG

11017

一個IP選項是太大了。

IP_BAD_DESTINATION

11018

一個壞的目的地。

IP_GENERAL_FAILURE

11050

一般故障。這個錯誤可以返回一些畸形的ICMP數據包

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/162899.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/162899.shtml
英文地址,請注明出處:http://en.pswp.cn/news/162899.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

23款奔馳GLC260L升級原廠360全景影像 高清環繞

本次星駿匯小許介紹的是23款奔馳GLC260L升級原廠360全景影像&#xff0c;上帝視角看清車輛周圍環境&#xff0c;更輕松駕駛 升級360全景影像系統共有前后左右4個攝像頭&#xff0c;分別在車頭&#xff0c;車尾&#xff0c;以及兩邊反光鏡下各一個&#xff0c;分別用來采集車頭&…

C# 宏--釋義及實例

1.宏-釋義 在C#中&#xff0c;宏&#xff08;Macro&#xff09;通常指的是預處理指令&#xff08;Preprocessor Directive&#xff09;&#xff0c;用于在編譯時對源代碼進行一些宏替換或條件編譯的操作。C#中的宏使用預處理器指令#define和#undef來定義和取消定義宏&#xff…

C++string_view簡介

1. 簡介 C17之后才有string_view&#xff0c;主要為了解決C語言常量字符串在std::string中的拷貝問題。 即readonly的string。 2. 引入 2.1 隱式拷貝問題 將C常量字符串拷貝了一次 #include <iostream> #include <string>int main() {std::string s{ "He…

Modbus RTU、Modbus 庫函數

Modbus RTU 與 Modbus TCP 的區別 一般在工業場景中&#xff0c;使用 Modbus RTU 的場景更多一些&#xff0c;Modbus RTU 基于串行協議進行收發數據&#xff0c;包括 RS232/485 等工業總線協議。采用主從問答式&#xff08;master / slave&#xff09;通信。 與 Modbus TCP 不…

基于springboot實現實習管理系統的設計與實現項目【項目源碼+論文說明】計算機畢業設計

基于sprinmgboot實現實習管理系統的設計與實現演示 摘要 隨著信息化時代的到來&#xff0c;管理系統都趨向于智能化、系統化&#xff0c;實習管理也不例外&#xff0c;但目前國內仍都使用人工管理&#xff0c;市場規模越來越大&#xff0c;同時信息量也越來越龐大&#xff0c;…

普通平衡樹

題意&#xff1a;略&#xff0c;題中較清晰。 用二叉查找樹來存儲數據&#xff0c;為了增加效率&#xff0c;盡量使左子樹和右子樹的深度差不超過一&#xff0c;這樣可以時間控制在logn&#xff0c;效率比較高。 右旋和左旋&#xff0c;目的是為了維護二叉樹的操作&#xff0…

Dubbo引入Zookeeper等注冊中心簡介以及DubboAdmin簡要介紹,為后續詳解Dubbo各種注冊中心做鋪墊!

文章目錄 一&#xff1a;Dubbo注冊中心引言 1&#xff1a;什么是Dubbo的注冊中心&#xff1f; 2&#xff1a;注冊中心關系圖解 3&#xff1a;引入注冊中心服務執行流程 4&#xff1a;Dubbo注冊中心好處 5&#xff1a;注冊中心核心作用 二&#xff1a;注冊中心實現方案 …

Springboot+vue的新冠病毒密接者跟蹤系統(有報告)。Javaee項目,springboot vue前后端分離項目

演示視頻&#xff1a; Springbootvue的新冠病毒密接者跟蹤系統(有報告)。Javaee項目&#xff0c;springboot vue前后端分離項目 項目介紹&#xff1a; 本文設計了一個基于Springbootvue的新冠病毒密接者跟蹤系統&#xff0c;采用M&#xff08;model&#xff09;V&#xff08;v…

HttpClient實現 get、post、put、delete請求【轉】

來自&#xff1a;HttpClient實現 get、post、put、delete請求_httpclient put請求-CSDN博客 目錄 HttpClient HttpClient的主要功能 httpclient使用示例主要步驟 Spring Boot 工程結構 HttpClient實現主要代碼&#xff1a; GET POST PUT Delete HttpClient HttpCli…

信息系統項目管理師-干系人管理論文提綱

快速導航 1.信息系統項目管理師-項目整合管理 2.信息系統項目管理師-項目范圍管理 3.信息系統項目管理師-項目進度管理 4.信息系統項目管理師-項目成本管理 5.信息系統項目管理師-項目質量管理 6.信息系統項目管理師-項目資源管理 7.信息系統項目管理師-項目溝通管理 8.信息系…

景區智慧旅游智能化系統方案:PPT全文58頁,附下載

關鍵詞&#xff1a;智慧景區解決方案&#xff0c;智慧文旅解決方案&#xff0c;智慧旅游解決方案&#xff0c;智慧文旅綜合運營平臺 一、景區智慧旅游智能化系統建設背景 近年來&#xff0c;隨著信息技術的快速發展和普及&#xff0c;以及旅游市場的不斷擴大和升級&#xff0…

電腦自動刪除文件怎么辦?如何恢復?

在數字化時代&#xff0c;電腦已經成為人們不可或缺的工具之一。然而&#xff0c;由于各種原因&#xff0c;我們有時會遇到電腦自動刪除文件的情況&#xff0c;這給我們的工作和生活帶來了很多不便。那么&#xff0c;當電腦自動刪除文件時&#xff0c;我們應該如何處理呢&#…

【Python爬蟲】8大模塊md文檔從0到scrapy高手,第8篇:反爬與反反爬和驗證碼處理

本文主要學習一下關于爬蟲的相關前置知識和一些理論性的知識&#xff0c;通過本文我們能夠知道什么是爬蟲&#xff0c;都有那些分類&#xff0c;爬蟲能干什么等&#xff0c;同時還會站在爬蟲的角度復習一下http協議。 Python爬蟲和Scrapy全套筆記直接地址&#xff1a; 請移步這…

數據結構與算法編程題14

設計一個算法&#xff0c;通過一趟遍歷在單鏈表中確定值最大的結點。 #include <iostream> using namespace std;typedef int Elemtype; #define ERROR 0; #define OK 1;typedef struct LNode {Elemtype data; //結點保存的數據struct LNode* next; //結構體指針…

RedHat NTP時間服務器配置Chrony(所有節點時間跟主節點時間同步)

NTP NTP&#xff08;Network Time Protocol&#xff09;是一種用于在計算機網絡中同步時鐘的協議。它的主要目的是確保網絡中的各個設備具有準確的時間參考&#xff0c;以便協調事件順序、安全通信和日志記錄等應用。它通過分層體系結構、時間同步算法和準確的時間參考源來確保…

Linux設置靜態IP

Linux設置靜態IP 使用ip addr查看ip&#xff0c;如下所示就是動態IP 1、什么是靜態IP&#xff1f; 靜態ip就是固定的ip&#xff0c;需要手動設置。靜態IP地址&#xff08;又稱固定IP地址&#xff09;是長期分配給一臺計算機或網絡設備使用的 IP 地址。一般來說&#xff0c;一…

【數據結構】C : 追星

C : 追星 文章目錄 C : 追星DescriptionInputOutputSampleInputOutput 解題思路AC代碼&#xff1a; Description 城市總共有N座。yintama是右京女神的狂熱粉&#xff0c;當他得知右京女神將要在城市N舉辦演唱會的時候&#xff0c;馬上開始準備動身前往城市N。原本他可以直接乘…

738. Monotone Increasing Digits 968. Binary Tree Cameras

738. Monotone Increasing Digits An integer has monotone increasing digits單調遞增數字 if and only if each pair of adjacent digits x and y satisfy x < y. Given an integer n, return the largest number that is less than or equal to n with monotone increa…

TypeScript 學習筆記 第三部分 貪吃蛇游戲

尚硅谷TypeScript教程&#xff08;李立超老師TS新課&#xff09; 1. 創建開發環境 創建工程&#xff0c;使用學習筆記的第二部分安裝css部分 npm i -D less less-loader css-loader style-loader對css部分處理&#xff0c;能夠運行在低版本瀏覽器 npm i -D postcss postcss…

oracle rac 19c修改不同網段public ip

客戶需求將才搭建的oracle 19.19數據庫從192.168.168.0網段調整到192.168.213網段 1.停止兩個節點集群 停止之前最好ocrdump一下&#xff0c;防止有問題 crsctl stop crs 2.修改public ip地址和/etc/hosts 3. 啟動crs 這時集群可以啟動&#xff0c;但是上面的一些資源啟動會…