检测UDP端口占用状态的函数
2016-03-04 15:16
369 查看
#include <WinSock2.h> #include <windows.h> #include <stdio.h> #include <tcpmib.h> #include <iprtrmib.h> #include <iphlpapi.h> #include <iostream> #pragma comment (lib,"Iphlpapi.lib") #pragma comment (lib,"Ws2_32.lib") using namespace std; bool CheckUdpPortState( IN unsigned num); int main (void) { CheckUdpPortState(57016); return 0; } bool CheckUdpPortState(IN unsigned num ) { PMIB_UDPTABLE_OWNER_PID pUdpTable; pUdpTable = new MIB_UDPTABLE_OWNER_PID; //获取所需要的内存大小 DWORD tmpSize = sizeof(MIB_UDPTABLE_OWNER_PID); GetExtendedUdpTable( pUdpTable, &tmpSize,false , AF_INET, UDP_TABLE_OWNER_PID, 0); //分配足够大小的内存并获取端口信息 DWORD dwSize = tmpSize/sizeof(MIB_UDPTABLE_OWNER_PID); delete pUdpTable; pUdpTable = NULL; pUdpTable = new MIB_UDPTABLE_OWNER_PID[dwSize]; GetExtendedUdpTable( pUdpTable, &tmpSize, true, AF_INET, UDP_TABLE_OWNER_PID, 0); HANDLE provileges = NULL; LUID Luid; //提权操作 if ( !OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES| TOKEN_QUERY, &provileges) ) { long res = GetLastError(); cout<<"error code "<<res<<endl; if (pUdpTable != NULL) { delete []pUdpTable; pUdpTable = NULL; } return false; } if (!LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&Luid)) { cout<<"LookupPrivilegeValue err!"<<endl; if (pUdpTable != NULL) { delete []pUdpTable; pUdpTable = NULL; } return false; } TOKEN_PRIVILEGES tp; tp.PrivilegeCount=1; tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED; tp.Privileges[0].Luid=Luid; if (!AdjustTokenPrivileges(provileges,0,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL)) { cout<<"AdjustTokenPrivileges err!"<<endl; if (pUdpTable != NULL) { delete []pUdpTable; pUdpTable = NULL; } return false; } //判断端口是否被占用,并找出占用端口的进程,对于某些system权限的进程需要提权 for (int i = 0; i < (int) pUdpTable->dwNumEntries; i++) { if ( num == ntohs( (u_short) pUdpTable->table[i].dwLocalPort ) ) { HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, false, pUdpTable->table[i].dwOwningPid); if ( hProcess == NULL ) { long res = GetLastError(); cout<<"error code "<<res<<endl; if (pUdpTable != NULL) { delete []pUdpTable; pUdpTable = NULL; } return false; } wchar_t wsProcessName[MAX_PATH + 1] = {0}; DWORD len = MAX_PATH; if ( QueryFullProcessImageName(hProcess, 0, wsProcessName, &len) ) { wcout<<L"Port["<<num<<L"] is occupied "<<L"by process["<<wsProcessName<<L"] PID[" <<pUdpTable->table[i].dwOwningPid<<L"]"<<endl; CloseHandle(hProcess); } else { CloseHandle(hProcess); hProcess = NULL; if (pUdpTable != NULL) { delete []pUdpTable; pUdpTable = NULL; } return false; } } } if (pUdpTable != NULL) { delete []pUdpTable; pUdpTable = NULL; } return true; }
相关文章推荐
- mac电脑安装brew软件管理工具
- MapReduce常见计算模式
- struts2 jsp <s:property value="path" /> path为中文的时候乱码
- JAVA格物致知基础篇:你所不知道的返回码
- 小学四则运算
- 记一个Android Installer的bug
- 千里码【8】数据脱敏
- 图片转换
- 用wxBot和图灵机器人API实现微信群聊机器人
- 关于TextView的一些个人总结之一
- char*和char[ ]的区别
- MATLAB并行工具箱GPU加速测试
- 练习启动各种浏览器的同时加载插件:Firefox, Chrome, IE
- SPRING IN ACTION 第4版笔记-第五章BUILDING SPRING WEB APPLICATIONS-003-示例项目用到的类及配置文件
- Masonry使用
- svn常用命令
- 8.leetcode题目165: Compare Version Numbers
- Leetcode ☞ 160. Intersection of Two Linked Lists ☆
- 【笔记】《C#大学教程》- 第6章 方法
- ZOJ 1638 Greedy Island