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

本文介绍了一个用于检查指定端口是否被占用,并找出占用端口的进程的方法。该方法通过调用GetExtendedTcpTable函数获取TCP连接表,然后遍历连接表来查找目标端口及其对应的进程ID。
boolCheckPortState( IN unsigned num)
{
    PMIB_TCPTABLE_OWNER_PID pTcpTable;
    pTcpTable = newMIB_TCPTABLE_OWNER_PID;
     
    //获取所需要的内存大小
    DWORDtmpSize = sizeof(MIB_TCPTABLE_OWNER_PID);
    GetExtendedTcpTable( pTcpTable, &tmpSize,false, AF_INET,  TCP_TABLE_OWNER_PID_ALL, 0);
 
    //分配足够大小的内存并获取端口信息
    DWORDdwSize = tmpSize/sizeof(MIB_TCPTABLE_OWNER_PID);
    deletepTcpTable;
    pTcpTable = NULL;
    pTcpTable = newMIB_TCPTABLE_OWNER_PID[dwSize];
    GetExtendedTcpTable( pTcpTable, &tmpSize, true, AF_INET,  TCP_TABLE_OWNER_PID_ALL, 0);
 
    //判断端口是否被占用,并找出占用端口的进程,对于某些system权限的进程需要提权
    for(inti = 0; i < (int) pTcpTable->dwNumEntries; i++) {
        if( num == ntohs( (u_short) pTcpTable->table[i].dwLocalPort ) )
        {
            HANDLEprovileges = NULL;
            LUID Luid;
            //提权操作
            if( !OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES| TOKEN_QUERY, &provileges) )
            {
                longres = GetLastError();
                cout<<"error code "<<res<<endl;
                if(pTcpTable != NULL)
                {
                    delete[]pTcpTable;
                    pTcpTable = NULL;
                }
                returnfalse;
            }
 
            if(!LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&Luid))
            {
                cout<<"LookupPrivilegeValue err!"<<endl;
                if(pTcpTable != NULL)
                {
                    delete[]pTcpTable;
                    pTcpTable = NULL;
                }
                returnfalse;
            }
 
            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;
                }
                returnfalse;
            }
 
            HANDLEhProcess = OpenProcess( PROCESS_ALL_ACCESS, false, pTcpTable->table[i].dwOwningPid);
            if( hProcess == NULL )
            {
                longres = GetLastError();
                cout<<"error code "<<res<<endl;
                if(pTcpTable != NULL)
                {
                    delete[]pTcpTable;
                    pTcpTable = NULL;
                }
                returnfalse;
            }
            wchar_twsProcessName[MAX_PATH + 1] = {0};
            DWORDlen = 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;
                }
                returnfalse;
            }
        }
    }
 
    if(pTcpTable != NULL)
    {
        delete[]pTcpTable;
        pTcpTable = NULL;
    }
 
    returntrue;
}


TCP,UDP服务端口,HMODULE hIpDLL = LoadLibrary( "iphlpapi.dll"); if ( !hIpDLL) return; PMIB_TCPTABLE_OWNER_PID pTcpTable(NULL); DWORD dwSize(0); PGet_Extended_TcpTable pGetExtendedTcpTable = NULL; pGetExtendedTcpTable = (PGet_Extended_TcpTable) GetProcAddress(hIpDLL, "GetExtendedTcpTable"); if(pGetExtendedTcpTable==NULL) { FreeLibrary(hIpDLL); return; } if(pGetExtendedTcpTable(pTcpTable, &dwSize, TRUE, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0) == ERROR_INSUFFICIENT_BUFFER) pTcpTable = (MIB_TCPTABLE_OWNER_PID *)new char[dwSize];//重新分配缓冲区 if (pGetExtendedTcpTable(pTcpTable, &dwSize, TRUE, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0) != NO_ERROR) { delete pTcpTable; return; } CString sTemp; m_PortList.DeleteAllItems(); int nNum = (int)pTcpTable->dwNumEntries; //TCP连接的数目 // nNum = 0; for (int i = 0; itable[i].dwLocalAddr))); sTemp.Format("%u",htons((WORD)pTcpTable->table[i].dwLocalPort)); m_PortList.SetItemText(i,4,sTemp); m_PortList.SetItemBgColor(i,4,RGB(210,0,0)); m_PortList.SetItemText(i,5,FormatNumToIpv4(htonl(pTcpTable->table[i].dwRemoteAddr))); sTemp.Format("%u",htons((WORD) pTcpTable->table[i].dwRemotePort)); m_PortList.SetItemText(i,6,sTemp); sTemp.Format("%u",pTcpTable->table[i].dwOwningPid); m_PortList.SetItemText(i,8,sTemp); //ProcessPidToName(pTcpTable->table[i].dwOwningPid,i); ProcessPidToNameX(pTcpTable->table[i].dwOwningPid,i); switch (pTcpTable->table[i].dwState) { case MIB_TCP_STATE_CLOSED: m_PortList.SetItemText(i,2,"CLOSED"); break; case MIB_TCP_STATE_LISTEN: m_PortList.SetItemText(i,2,"LISTEN"); break; case MIB_TCP_STATE_SYN_SENT: m_PortList.SetItemText(i,2,"SYN
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值