检测TCP端口占用状态的函数

来源:互联网 发布:中国多重人格案例 知乎 编辑:程序博客网 时间:2024/05/18 03:30
#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 CheckPortState( IN unsigned num);int main (void){CheckPortState(3389);return 0;}bool CheckPortState( IN unsigned num){PMIB_TCPTABLE_OWNER_PID pTcpTable;pTcpTable = new MIB_TCPTABLE_OWNER_PID;//获取所需要的内存大小DWORD tmpSize = sizeof(MIB_TCPTABLE_OWNER_PID); GetExtendedTcpTable( pTcpTable, &tmpSize,false , AF_INET,  TCP_TABLE_OWNER_PID_ALL, 0);//分配足够大小的内存并获取端口信息DWORD dwSize = tmpSize/sizeof(MIB_TCPTABLE_OWNER_PID);delete pTcpTable;pTcpTable = NULL;pTcpTable = new MIB_TCPTABLE_OWNER_PID[dwSize];GetExtendedTcpTable( pTcpTable, &tmpSize, true, AF_INET,  TCP_TABLE_OWNER_PID_ALL, 0);//判断端口是否被占用,并找出占用端口的进程,对于某些system权限的进程需要提权for (int i = 0; i < (int) pTcpTable->dwNumEntries; i++) {if ( num == ntohs( (u_short) pTcpTable->table[i].dwLocalPort ) ){HANDLE provileges = NULL;LUID Luid;//提权操作if ( !OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES| TOKEN_QUERY, &provileges) ){long res = GetLastError();cout<<"error code "<<res<<endl;if (pTcpTable != NULL){delete []pTcpTable;pTcpTable = NULL;}return false;}if (!LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&Luid)){cout<<"LookupPrivilegeValue err!"<<endl;if (pTcpTable != NULL){delete []pTcpTable;pTcpTable = 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 (pTcpTable != NULL){delete []pTcpTable;pTcpTable = NULL;}return false;}HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, false, pTcpTable->table[i].dwOwningPid);if ( hProcess == NULL ){long res = GetLastError();cout<<"error code "<<res<<endl;if (pTcpTable != NULL){delete []pTcpTable;pTcpTable = 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["<<pTcpTable->table[i].dwOwningPid<<L"]"<<endl;CloseHandle(hProcess);}else{CloseHandle(hProcess);hProcess = NULL;if (pTcpTable != NULL){delete []pTcpTable;pTcpTable = NULL;}return false;}}}if (pTcpTable != NULL){delete []pTcpTable;pTcpTable = NULL;}return true;}

0 0
原创粉丝点击