当前位置: 首页 > news >正文

UDP端口可达性检测(端口扫描)工具开发

UDP端口可达性检测(端口扫描)工具开发

1、应用场景分析

主机X主机Y部署在AB双网环境下,两个主机间通过UDP协议进行数据交互。应用程序发送数据时,优先使用A网发送数据,如果A网异常则通过B网发送数据。两个主机应用间没有设置心跳帧 ,所以无法检测到对方UDP端口是否可达。

在这里插入图片描述

场景诉求

主机间发送UDP数据前,应能检测对方端口是否可达。如果不可达,则进行A/B网切换。达到动态检测对方网络服务端口状态,实时切换网络链路效果。

①、 主机不可达

场景分析:

  • 主机关机。
  • 防火墙开启策略。
  • 网卡故障、网线连接异常。
  • 网络配置错误。

场景应对策略:

通过PING echo 判断主机是否可达。

②、 端口不可达

主机可达,端口不可达。

场景分析:

  • 服务未启动,端口未监听。
  • 防火墙开启策略。

场景应对策略:

结合ICMP和内核网络协议栈,判断UDP端口是否可达。

2、UDP端口扫描程序开发

①、Windows程序

【1】、 理论知识

略。

【2】、 C++源码

界面控件设计。

在这里插入图片描述

对话框初始化部分代码。

BOOL CUdpDetectDlg::OnInitDialog()
{CDialogEx::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。// IDM_ABOUTBOX 必须在系统命令范围内。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动//  执行此操作SetIcon(m_hIcon, TRUE);			// 设置大图标SetIcon(m_hIcon, FALSE);		// 设置小图标// 初始化Windows套接字WSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){CString strMsg;strMsg.Format("WSAStartup失败!");return 0;}// CListCtrlDWORD dwStyle = m_ListCtrl.GetExtendedStyle();m_ListCtrl.SetExtendedStyle(dwStyle | LVS_EX_FULLROWSELECT );m_ListCtrl.InsertColumn(0, _T("主机端口"), LVCFMT_LEFT, 130);m_ListCtrl.InsertColumn(1, _T("扫描结果"), LVCFMT_LEFT, 100);m_ListCtrl.InsertColumn(2, _T("ICMP反馈"), LVCFMT_LEFT, 350);// 默认参数;m_EditScanHostIP.SetWindowText("192.168.58.1");m_EditScanPortStartNo.SetWindowText("50000");m_EditScanEndPortNo.SetWindowText("50005");return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

端口扫描部分代码。

//扫描端口;
void CUdpDetectDlg::ScanPort()
{CString strScanHost;m_EditScanHostIP.GetWindowText(strScanHost);CString strScanStartPort;m_EditScanPortStartNo.GetWindowText(strScanStartPort);CString strScanEndPort;m_EditScanEndPortNo.GetWindowText(strScanEndPort);int iStartPort = _ttoi(strScanStartPort);int iEndPort = _ttoi(strScanEndPort);if (iEndPort < iStartPort)  return;m_ListCtrl.DeleteAllItems();for (int ii = iStartPort; ii <= iEndPort;++ii){BOOL isPortOpenF = FALSE;char szErrText[256] = { 0 };sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if (sock < 0) return;//设置收发缓冲区大小;int iTemp = 1024 * 2;setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&iTemp, sizeof(iTemp));setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *)&iTemp, sizeof(iTemp));//设置接收超时;int iRecvTimeout = 1000;setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&iRecvTimeout, sizeof(iRecvTimeout));struct sockaddr_in txaddr;txaddr.sin_family = AF_INET;txaddr.sin_addr.s_addr = inet_addr(strScanHost.GetBuffer(0));txaddr.sin_port = htons(ii);int addrlen = sizeof(txaddr);char txbuff[] = "";int txlen = sendto(sock, txbuff, sizeof(txbuff), 0, (sockaddr*)&txaddr, addrlen);char rxbuff[24] = { 0 };int rxlen = recvfrom(sock, rxbuff, 24, 0, (sockaddr*)&txaddr, &addrlen);if (rxlen < 0){if (WSAGetLastError() == WSAECONNRESET){FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,NULL, WSAECONNRESET, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),szErrText, 256, NULL);isPortOpenF = FALSE;}elseisPortOpenF = TRUE;}CString strHostDesc;strHostDesc.Format("%s:%d", strScanHost, ii);CString strPortState;if (isPortOpenF)strPortState.Format("端口可达");elsestrPortState.Format("端口不可达");int iIndex = m_ListCtrl.GetItemCount();m_ListCtrl.InsertItem(iIndex, strHostDesc);m_ListCtrl.SetItemText(iIndex, 1, strPortState);m_ListCtrl.SetItemText(iIndex, 2, CString(szErrText));closesocket(sock);}
}
【3】、 编译程序

在这里插入图片描述

【4】、 运行程序

先将目标主机的50001端口开启监听。然后用测试程序检测。

在这里插入图片描述

开始扫描端口。

在这里插入图片描述

②、 Linux程序

【1】、 理论知识

略。

【2】、 C++源码

UdpScan.cxx

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <string>
#include<algorithm>int main()
{printf("*********************************************************************\n");printf("*                                                                   *\n");printf("*                      Linux 端口扫描工具 V0.1                       *\n");printf("*                                                                   *\n");printf("*********************************************************************\n");printf("请输入扫描主机IP地址: ");char input[256] = {0};char* ptr = fgets(input,256,stdin);if(ptr == nullptr) { printf("输入参数异常,结束程序!\n"); }std::string strHost = std::string(ptr);printf("请输入扫描UDP端口范围(比如2000-2500): ");ptr = fgets(input,256,stdin);if(ptr == nullptr) { printf("输入参数异常,结束程序!\n"); }std::string strPort = std::string(ptr);int iStartPort = 0, iEndPort = 0;int pos = strPort.find("-");if(pos != std::string::npos){std::string strStartPort = strPort.substr(0,pos);std::string strEndPort = strPort.substr(pos+1);iStartPort = std::stoi(strStartPort);iEndPort = std::stoi(strEndPort);}if(iEndPort < iStartPort) return 1;for(int ii = iStartPort; ii <= iEndPort; ++ ii){   int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);//将ICMP端口不可达信息报到应用层协议int flag = 1; setsockopt(sock, IPPROTO_IP, IP_RECVERR , &flag,sizeof(int)); //设置接收超时struct timeval timeout = {0,300};setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(struct timeval));struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_addr.s_addr = inet_addr(strHost.c_str());addr.sin_port = htons(ii);char txbuff[] = ""; int ret = sendto(sock,txbuff,sizeof(txbuff),0,(struct sockaddr*)&addr,sizeof(addr)); char rxbuff[24] = { 0 };int addrlen = sizeof(addr);int rxlen = recvfrom(sock, rxbuff, sizeof(rxbuff), 0, (struct sockaddr *)&addr, &addrlen);if (rxlen == -1){//剔除回车符strHost.erase(std::remove(strHost.begin(), strHost.end(), '\n'), strHost.end());if (errno == ECONNREFUSED){printf("主机【%s:%d】端口不可达!\n",strHost.c_str(),ii);}elseprintf("主机【%s:%d】端口可达!\n",strHost.c_str(),ii);} close(sock);}printf("端口扫描结束!\n");return 0;
}

代码截图:

在这里插入图片描述

在这里插入图片描述

【3】、 编译程序
g++ -o udpscan UdpScan.cxx -fpermissive -std=c++11 -w -W
【4】、 运行程序

先将目标主机的50001端口开启监听。然后用测试程序检测。

在这里插入图片描述

开始扫描端口。

在这里插入图片描述

相关文章:

UDP端口可达性检测(端口扫描)工具开发

UDP端口可达性检测(端口扫描)工具开发 1、应用场景分析 主机X与主机Y部署在AB双网环境下&#xff0c;两个主机间通过UDP协议进行数据交互。应用程序发送数据时&#xff0c;优先使用A网发送数据&#xff0c;如果A网异常则通过B网发送数据。两个主机应用间没有设置心跳帧 &…...

第三届计算、通信、感知与量子技术国际会议(CCPQT 2024)会议通知

会议信息 大会官网&#xff1a;http://www.ccpqt.org/ 官方邮箱&#xff1a;ccpqt_paper126.com 会议地点&#xff1a;中国珠海 会议时间&#xff1a;2024年10月25日-10月27日 主讲嘉宾 Prof. Trung Q. Duong IEEE Fellow and AAIA Fellow Memorial University of Newfoundl…...

Qt文件读写

Qt中文件读写类简述 包含头文件#include <QFile> 读写模式如下 枚举 文件读写步骤 1 先使用string 类型来接受打开文件的返回值 QFileDialog::getOpenFileName(this,"文件","./"); //打开一个文件 2 构建文件对象 Qfile ff (qstring)接受打…...

发现了一套超厉害的英语资料,绝对YYDS

昨某节目主持人与我闲聊英语学习的事情。 她工作数年&#xff0c;希望提升英文资讯的阅读能力。她主持的是中文节目&#xff0c;但节目对个人的知识广度和深度要求颇高。 现在的知识又太泛太杂&#xff0c;你需要了解国外最新资讯&#xff0c;多获得一手资料&#xff0c;面对节…...

C# new关键字作用

在C#中&#xff0c;当子类定义了与父类同名的字段或者方法时&#xff0c;可以使用new关键字进行隐藏。使用new和不使用new关键字的区别主要在于如何处理字段的隐藏和可访问性。 讲人话就是&#xff0c;假设父类的字段或方法&#xff0c;子类是可以直接访问的&#xff08;publi…...

Python代码之特征工程基础

1. 什么是特征工程 特征工程是指从原始数据中提取、转换和创建适合于模型训练的数据特征的过程。它是机器学习和深度学习中非常重要的一步&#xff0c;因为好的特征工程可以显著提高模型的性能。特征工程涉及从数据中提取有意义的信息&#xff0c;并将其转换为模型可以理解和使…...

低代码平台:效率利器还是质量妥协?

目录 低代码平台&#xff1a;效率利器还是质量妥协&#xff1f; 一、引言 二、低代码平台的定义和背景 1、什么是低代码平台&#xff1f; 2、低代码平台的兴起 三、低代码开发的机遇 1、提高开发效率 2、降低开发成本 3、赋能业务人员 四、低代码开发的挑战 1、质量…...

大数据-Big Data

1. 简介 1.1. 主要特点 大数据(Big Data)是指规模巨大、复杂多变的数据集合,这些数据集来源于多个不同的源,包括社交媒体、移动设备、物联网、传感器等。大数据的主要特点如下: 数据量大(Volume):大数据的起始计量单位是PB(1024TB)、EB(1024PB,约100万TB)或ZB(…...

Redis的持久化的策略

Redis的持久化的策略 官方文档说明 AOF持久化策略RDB持久化的策略 AOF持久化策略 AOF持久性记录服务器接收到的每个写操作&#xff0c;然后&#xff0c;可以在服务器启动时再次重播这些操作&#xff0c;重建原始数据集&#xff0c;使用与Redis协议本身相同的格式记录命令。…...

【八】Zookeeper3.7.1集成Hadoop3.3.4集群安装

文章目录 1.基本原理2.下载并解压ZooKeeper3.配置环境变量4.配置ZooKeeper5.创建数据目录并初始化myid6.启动ZooKeeper7.配置ZooKeeper集成到Hadoop8.重启Hadoop9.ZooKeeper状态检查 1.基本原理 ZooKeeper 是一个分布式协调服务&#xff0c;用于分布式系统中管理配置信息、命名…...

【C/C++笔记】:易错难点3 (二叉树)

选择题 &#x1f308;eg1 一棵有15个节点的完全二叉树和一棵同样有15个节点的普通二叉树&#xff0c;叶子节点的个数最多会差多少个&#xff08;&#xff09;&#xff1f; 正确答案&#xff1a; C A. 3 B. 5 C. 7 D. 9 解析&#xff1a;普通二叉树的叶子节…...

一篇文章解决Webpack

一&#xff1a;什么是webpack webpack是一个用于现代JavaScript应用程序的静态模块打包工具。本质是一个软件包&#xff0c; 静态模块包括以下&#xff1a;html、css、js、图片等固定内容的文件 二&#xff1a;webpack工作原理 当 webpack 处理应用程序时&#xff0c;它会在内…...

速盾:cdn如何解析php文件中的图片?

CDN&#xff08;Content Delivery Network&#xff09;是一种通过分布在全球各地的服务器来加速网络内容传输的技术。CDN通过将内容缓存在离用户最近的服务器上&#xff0c;提供更快的访问速度和更好的用户体验。在解析PHP文件中的图片时&#xff0c;CDN可以起到以下几个方面的…...

如何快速实现MODBUS TCP转Profinet——泗博网关EPN-330

泗博网关EPN-330可作为PROFINET从站&#xff0c;支持与西门子S7-200 SMART/300/400/1200/1500全系列PLC以及具有PROFINET主站的系统无缝对接&#xff0c;而Modbus TCP端&#xff0c;可以与Modbus TCP从站设备、主站PLC、DCS系统以及组态软件等进行数据交互。 通过EPN-330&…...

什么是实时数据仓库?它有哪些不可替代之处?

【实时数据仓库】可以分开来理解&#xff1a; ✅【实时数据】&#xff1a;即能够快速处理数据&#xff0c;且几乎无延迟的提供最新的数据的能力。 ✅【仓库管理】&#xff1a;可以理解为对仓库的库存控制、对仓库的存储优化以及协调物流。 那么实时数据仓库就是&#xff1a;…...

《Ubuntu22.04环境下的ROS2学习笔记1》

一、在ROS2环境下创建工作空间 ROS2相比ROS1来说工作空间的创建有较大的不同&#xff0c;同时工作空间中的四个目录被更换为src(存放源码) &#xff0c; build(存放编译的中间文件) &#xff0c; install(存放可执行文件) &#xff0c; log(日志)。同时命令行也有些许变化&…...

Jupyter nbextensions安装与使用

Jupyter nbextensions的安装与使用主要包括以下几个步骤&#xff1a; 一、安装步骤 确保已安装Jupyter Notebook 如果尚未安装Jupyter Notebook&#xff0c;可以使用pip命令进行安装&#xff1a; pip install jupyter 安装nbextensions 使用pip命令安装nbextensions包&#x…...

java.nio.charset.MalformedInputException: Input length = 1

1、问题 项目启动报错&#xff1a; Exception in thread "main" org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length 1提示原因&#xff1a; Caused by: java.nio.charset.MalformedInputException: Input length 1…...

yarn的安装和配置使用

文章目录 一、前言二、yarn简介三、yarn的特点四、yarn安装五、配置yarn5.1 全局配置5.2 项目配置 五、使用yarn六、yarn常用命令七、版本管理 一、前言 Yarn是facebook发布的一款取代npm的包管理工具&#xff0c;本文给大家介绍yarn的安装和使用&#xff0c;最详细教程&#…...

JVM知识总结(即时编译)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 即时编译 Java编译器经过解释执行&#xff0c;其执行速度必然会比…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化

iOS 应用的发布流程一直是开发链路中最“苹果味”的环节&#xff1a;强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说&#xff0c;这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发&#xff08;例如 Flutter、React Na…...

高分辨率图像合成归一化流扩展

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 1 摘要 我们提出了STARFlow&#xff0c;一种基于归一化流的可扩展生成模型&#xff0c;它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流&#xff08;TARFlow&am…...

嵌入式面试常问问题

以下内容面向嵌入式/系统方向的初学者与面试备考者,全面梳理了以下几大板块,并在每个板块末尾列出常见的面试问答思路,帮助你既能夯实基础,又能应对面试挑战。 一、TCP/IP 协议 1.1 TCP/IP 五层模型概述 链路层(Link Layer) 包括网卡驱动、以太网、Wi‑Fi、PPP 等。负责…...

Qwen系列之Qwen3解读:最强开源模型的细节拆解

文章目录 1.1分钟快览2.模型架构2.1.Dense模型2.2.MoE模型 3.预训练阶段3.1.数据3.2.训练3.3.评估 4.后训练阶段S1: 长链思维冷启动S2: 推理强化学习S3: 思考模式融合S4: 通用强化学习 5.全家桶中的小模型训练评估评估数据集评估细节评估效果弱智评估和民间Arena 分析展望 如果…...