博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GetUdpTable获得UDP端口使用信息
阅读量:4217 次
发布时间:2019-05-26

本文共 4683 字,大约阅读时间需要 15 分钟。

函数原型参考https://msdn.microsoft.com/zh-cn/library/windows/desktop/aa366033(v=vs.85)

本文主要使用windows系统提供的GetUdpTable函数来获得指定端口是否被UDP使用,TCP端口使用情况类似,GetTcpTable函数可以实现。

// PortMonitoring.h: interface for the CPortMonitoring class.////#if !defined(AFX_PORTMONITORING_H__A8CBE1A3_0489_4DA0_862F_F3CDFFE4AB9C__INCLUDED_)#define AFX_PORTMONITORING_H__A8CBE1A3_0489_4DA0_862F_F3CDFFE4AB9C__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000typedef unsigned long DWORD;class CPortMonitoring{public:	CPortMonitoring();	virtual ~CPortMonitoring();	//检测端口是否被占用	static bool CheckUdpPort(unsigned int nPort);};#endif // !defined(AFX_PORTMONITORING_H__A8CBE1A3_0489_4DA0_862F_F3CDFFE4AB9C__INCLUDED_)

// PortMonitoring.cpp: implementation of the CPortMonitoring class.////#include 
#include "windows.h"#include "PortMonitoring.h"#define ANY_SIZE 120#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;//#define new DEBUG_NEW //DEBUG_NEW可以定位内存泄露#endif//// Construction/Destruction//CPortMonitoring::CPortMonitoring(){}CPortMonitoring::~CPortMonitoring(){}连接信息结构体typedef struct _MIB_UDPROW{ DWORD dwLocalAddr; // 本地计算机地址 DWORD dwLocalPort; // 本地计算机端口 //int dwProcessId; //进程id} MIB_UDPROW, *PMIB_UDPROW;TCP连接表typedef struct _MIB_UDPTABLE{ DWORD dwNumEntries; //当前包含MIB_UDPROW类型的总数 MIB_UDPROW table[ANY_SIZE]; //存放每个UDP连接的端口和IP} MIB_UDPTABLE, *PMIB_UDPTABLE;//检测端口是否被占用bool CPortMonitoring::CheckUdpPort(unsigned int nPort){ if (nPort < 1024 || nPort > 65000) return false; PMIB_UDPTABLE pudptable = NULL; DWORD dwSize = 0; HINSTANCE hInst; //动态链接库模块句柄 hInst = LoadLibraryA("iphlpapi.dll"); //动态加载iphlpapi.dll //定义函数指针类型 typedef long(__stdcall *ADDPROC) (PMIB_UDPTABLE pUdpTable, PDWORD pdwSize, BOOL bOrder); //获取iphlpapi.dll导出函数 ADDPROC GetUdpTable = (ADDPROC)GetProcAddress(hInst, "GetUdpTable"); if (GetUdpTable(pudptable, &dwSize, TRUE) == ERROR_INSUFFICIENT_BUFFER) //pTcpTable空间不足 { pudptable = new MIB_UDPTABLE[dwSize]; //为pUdpTable申请足够的空间 if (GetUdpTable(pudptable, &dwSize, TRUE) == NO_ERROR) //GetTcpTable调用成功 { //检测端口nPort是否在 for (UINT i = 0; i < pudptable->dwNumEntries; i++) { if (nPort != ntohs(pudptable->table[i].dwLocalPort)) continue; //释放资源 delete[] pudptable; FreeLibrary((HMODULE)hInst); return FALSE; } } } //释放资源 delete[] pudptable; FreeLibrary((HMODULE)hInst); return TRUE;}

下面是加上TCP检测的:

#include 
#include "windows.h"#include "port_detect_interface.h"#pragma comment(lib, "ws2_32.lib")PortDetectImpl::PortDetectImpl(){}PortDetectImpl::~PortDetectImpl(){}/*** 检测UDP端口是否被占用** @param [in] port 待检测端口号** @return bool: 0 未占用,1 占用*/bool PortDetectImpl::CheckUdpPort(unsigned int port){ if (port < 1024 || port > 65535) return TRUE; PMIB_UDPTABLE pudptable = NULL; DWORD dwSize = 0; HINSTANCE hInst; //动态链接库模块句柄 hInst = LoadLibraryA("iphlpapi.dll"); //动态加载iphlpapi.dll //定义函数指针类型 typedef long(__stdcall *ADDPROC) (PMIB_UDPTABLE pUdpTable, PDWORD pdwSize, BOOL bOrder); //获取iphlpapi.dll导出函数 ADDPROC GetUdpTable = (ADDPROC)GetProcAddress(hInst, "GetUdpTable"); if (GetUdpTable(pudptable, &dwSize, TRUE) == ERROR_INSUFFICIENT_BUFFER) //pTcpTable空间不足 { pudptable = new MIB_UDPTABLE[dwSize]; //为pTcpTable申请足够的空间 if (GetUdpTable(pudptable, &dwSize, TRUE) == NO_ERROR) //GetTcpTable调用成功 { //检测端口nPort是否在 for (UINT i = 0; i < pudptable->dwNumEntries; i++) { if (port != ntohs(pudptable->table[i].dwLocalPort)) continue; //释放资源 delete[] pudptable; FreeLibrary((HMODULE)hInst); return TRUE; } } } //释放资源 delete[] pudptable; FreeLibrary((HMODULE)hInst); return FALSE;}/*** 检测TCP端口是否被占用** @param [in] port 待检测端口号** @return bool: 0 未占用,1 占用*/bool PortDetectImpl::CheckTcpPort(unsigned int port){ if (port < 1024 || port > 65535) { return TRUE; } PMIB_TCPTABLE ptcptable = NULL; DWORD dwSize = 0; HINSTANCE hInst; //动态链接库模块句柄 hInst = LoadLibraryA("iphlpapi.dll"); //动态加载iphlpapi.dll //定义函数指针类型 typedef long(__stdcall *ADDPROC) (PMIB_TCPTABLE pTcpTable, PDWORD pdwSize, BOOL bOrder); //获取iphlpapi.dll导出函数 ADDPROC GetTcpTable = (ADDPROC)GetProcAddress(hInst, "GetTcpTable"); if (GetTcpTable(ptcptable, &dwSize, TRUE) == ERROR_INSUFFICIENT_BUFFER) //pTcpTable空间不足 { ptcptable = new MIB_TCPTABLE[dwSize]; //为pTcpTable申请足够的空间 if (GetTcpTable(ptcptable, &dwSize, TRUE) == NO_ERROR) //GetTcpTable调用成功 { //检测端口nPort是否在 for (UINT i = 0; i < ptcptable->dwNumEntries; i++) { if (port != ntohs(ptcptable->table[i].dwLocalPort)) continue; //释放资源 delete[] ptcptable; FreeLibrary((HMODULE)hInst); return TRUE; } } } //释放资源 delete[] ptcptable; FreeLibrary((HMODULE)hInst); return FALSE;}

转载地址:http://nrpmi.baihongyu.com/

你可能感兴趣的文章
Secure CRT 自动记录日志 配置 小记
查看>>
RMAN RAC 到 单实例 duplicate 自动分配通道 触发 ORA-19505 错误
查看>>
mysql 随机分页的优化
查看>>
DB2快速创建测试库
查看>>
利用db2look查看ddl
查看>>
java中的mmap实现
查看>>
Redis的Aof被阻塞原因调查
查看>>
Redis Cluster的FailOver失败案例分析
查看>>
Android Alarm驱动源代码分析(Alarm.c)
查看>>
S3C2440上LCD驱动 (FrameBuffer)实例开发讲解
查看>>
Linux音频编程指南
查看>>
usb-otg-调试心得
查看>>
USB规范浏览--设备和主机规范
查看>>
男人的品位--我们自己的最求
查看>>
Android (Linux) Suspend流程
查看>>
LINUX时间管理
查看>>
定时器的使用
查看>>
为Android加入busybox工具
查看>>
使用技巧busybox
查看>>
如何查看与/dev/input目录下的event对应的设备
查看>>