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

news2024/11/19 1:28:00

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;
	}

	// CListCtrl
	DWORD 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;
			}
			else
				isPortOpenF = TRUE;
		}

		CString strHostDesc;
		strHostDesc.Format("%s:%d", strScanHost, ii);

		CString strPortState;
		if (isPortOpenF)
			strPortState.Format("端口可达");
		else
			strPortState.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);
	         }
             else
                  printf("主机【%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端口开启监听。然后用测试程序检测。

在这里插入图片描述

开始扫描端口。

在这里插入图片描述

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

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

相关文章

Vue 3+Vite+Eectron从入门到实战系列之(四)一Electron热身运动(二)

在electron里面能不呢实现暗黑模式和明亮模式的切换&#xff1f;我们怎么读取主进程里面的数据和系统数据。这篇就是来实现这几个效果的 实现效果 更改系统的主题色 在 App.vue 中添加代码。 <el-button type"warning" click"changeTheme">更改系…

Python 进行反射和元编程

反射和元编程是Python中两种强大且高级的编程技术。反射允许程序在运行时检查和修改自身结构和行为&#xff0c;而元编程则是编写可以操作其他代码的代码&#xff0c;通常通过使用元类、装饰器等技术来实现。 1. 反射 反射是指程序在运行时检查和操作自身结构的能力。Python通…

【Dash】使用 dash_mantine_components 创建图表

一、Styling Your App The examples in the previous section used Dash HTML Components to build a simple app layout, but you can style your app to look more professional. This section will give a brief overview of the multiple tools that you can use to enhan…

日常知识点之阿里云服务器提示禁用了密码登录方式

使用阿里云服务器进行一些实例测试时&#xff0c;发现业务启动后&#xff0c;服务器连接卡死&#xff0c;重连显示拒绝密码登录。 尝试好几次&#xff0c;因为在做的业务&#xff0c;怀疑可能时磁盘或者内存导致&#xff0c;但是&#xff0c;这玩意为啥会导致拒绝密码登录也是…

【C++】初识面向对象:类与对象详解

C语法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;命名空间缺省参数与函数重载C相关特性 本章将介绍C中一个重要的概念——类。通过类&#xff0c;我们可以类中定义成员变量和成员函数&#xff0c;实现模块化封装&#xff0c;从而构建更加抽象和复杂的工程。 &…

springboot约车APP-计算机毕业设计源码96773

基于Spring Boot的约车APP设计与实现 摘要 本文基于Spring Boot框架设计并实现了一款约车APP&#xff0c;旨在为用户提供便捷的出行服务。通过后端Spring Boot框架和前端交互界面的设计&#xff0c;实现了用户快速叫车、实时定位、路线规划等功能。系统结合了高效的后端处理和直…

LVS 调度器 nat和DR模式

lvs-nat 修改请求报文的目标IP,多目标IP的DNAT 配置网络 LVS主机 注意网卡的顺序 &#xff08;nat和主机模式&#xff09; [rootlvs ~]# cat /etc/NetworkManager/system-connections/ens160.nmconnection [connection] idens160 typeethernet interface-nameens160 ​ [ip…

[Unity]在场景中随机生成不同位置且不重叠的物体

1.前言 最近任务需要用到Unity在场景中随机生成物体&#xff0c;且这些物体不能重叠&#xff0c;简单记录一下。 参考资料:How to ensure that spawned targets do not overlap ? 2.结果与代码 结果如下所示&#xff1a; 代码如下所示&#xff1a; using System.Collec…

阿一网络安全学院学员作业——XSS DOM 型靶场

第一题 第二题 查看源码发现这里引用的 angular 框架 body 头为 ng-app 搜索文献得知 angular 框架可以将 {{x}} 内部执行函数 试验得知 angular 可以执行 {{ }} 内部函数 那么我们注入代码 {{alert()}} 调用了 search 解释器 那么我们注入的 search 是 先闭合 ”…

详解Xilinx FPGA高速串行收发器GTX/GTP(3)--GTX的时钟架构

目录 1、参考时钟 2、时钟方案 2.1、单个外部参考时钟驱动单个QUAD中的多个transceiver 2.2、单个外部参考时钟驱动多个QUAD中的多个transceiver 2.3、同一个Quad中,多个GTX Transceiver使用多个参考时钟 2.4、不同Quad中,多个GTX Transceiver 使用多个参考时钟 3、QP…

开源免费前端地图开发组件xdh-map

xdh-map是一个基于Openlayers的地图应用Vue组件&#xff0c;具有多方面的功能和特点。以下是对xdh-map的详细介绍&#xff1a; 一、功能与特性 内置多种地图瓦片&#xff1a;xdh-map内置了百度、高德、天地图等地图瓦片&#xff0c;使得开发者可以方便地在应用中集成多种地图…

机器视觉24

block使用流程 初始化工具 初始化相机 拍照事件 保存图片事件 读取图片事件 拍照完成后事件 检测事件 跳转block设置页面 曝光设置 关闭相机 保存图片封装方法 读取图片封装方法 //Block 设置窗体 实时显示 扩展 因为VP中有很多工具 所以在VS中使用时 可能频繁的导入工具…

DPDI online在线调度系统环境部署

DPDI online简介&#xff1a; DPDI Online 是一款基于Kettle的强大在线任务调度平台&#xff0c;凭借其高效与灵活性&#xff0c;专为调度和监控Kettle客户端生成的ETL任务而设计 DPDI online部署 DPDI服务部署文档包含依赖环境部署和应用本身部署 依赖环境部署 &#xff1…

Unity导入Avpro插件(3.0.8版本)打包安卓时报错

报错信息&#xff08;部分&#xff09; Exception while marshalling C:\Program Files\Unity\Hub\Editor\2022.3.34f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\SDK\build-tools\32.0.0\package.xml. Probably the SDK is read-only Exception while marshalling C:\Prog…

等保测评:如何应对网络攻击——构建全面的防御体系

在数字化转型的浪潮中&#xff0c;网络攻击已成为企业和组织面临的严峻挑战。等保测评&#xff0c;作为我国信息安全等级保护制度的重要组成部分&#xff0c;为企业提供了应对网络攻击的指导框架。本文旨在探讨等保测评在防御网络攻击中的关键作用&#xff0c;为企业提供实践指…

时间序列生成模型TimeGAN介绍与实现

目录 1. 模型介绍2. 问题提出3. 模型具体实现3.1 嵌入和恢复函数3.2 序列生成器和判别器3.3 联合学习编码、生成和迭代 4. 代码实现参考文献 时间序列数据在金融、医疗和物联网等领域具有广泛的应用。生成真实感的时间序列数据对于数据增强、隐私保护和模拟研究具有重要意义。T…

【Android Studio】原生应用部署第三方插件(探针)

一、本地引入包流程 &#xff08;一&#xff09;本地引入包内容 &#xff08;二&#xff09;本地引入包操作步骤 将 【probe-android-sdk】目录里面所有的aar包复制到嵌码项目工程&#xff08;App级别&#xff09;的 libs 目录下 二、添加插件 &#xff08;一&#xff09;…

代码规范 —— 数据库规范

优质博文&#xff1a;IT-BLOG-CN 一、建表规范 【1】表达是与否概率的字段&#xff0c;必须使用is_xxx的方式命令&#xff0c;数据类型是tinyint&#xff08;1表示是&#xff0c;0表示否&#xff09; 正例&#xff1a;表达逻辑删除的字段名is_active&#xff0c;0表示删除&a…

Missing or invalid credentials.(Git push报错解决方案)

参考博客&#xff1a;1 2 git push后报错Missing or invalid credentials的解决方案 1.右侧选择配置编辑器 2.搜索git.terminalAuthentication 把勾勾取消掉。 3.重启vscode。

3D数字人能一键生成?

最近有好多人询问数字人的情况&#xff0c;昨天遇到一个客户&#xff0c;我把数字人作品发给他看&#xff0c;他说“不像”&#xff0c;我把国际上别人做得最好的数字人发给他看&#xff0c;他还是说“不像”&#xff0c;我就知道这个客户没得谈了。后来我把网易公司做的数字人…