2013-03-22 3 views
3

Я использовал этот код для получения списка Открытого порта на моем ПК и приложения, использующего каждый порт.GetExtendedTcpTable не возвращает тот же результат, что и netstat -ano

string Port::GetListOfTcpPorts() 

{ 
    string ApplicationName = ""; 
    string result = ""; 
    string aux = ""; 
    string RemotePort = ""; 
    DWORD (WINAPI *pGetExtendedTcpTable)(
    PVOID pTcpTable, 
    PDWORD pdwSize, 
    BOOL bOrder, 
    ULONG ulAf, 
    TCP_TABLE_CLASS TableClass, 
    ULONG Reserved 
); 
    MIB_TCPTABLE_OWNER_PID *pTCPInfo; 
    MIB_TCPROW_OWNER_PID *owner; 
    DWORD size; 
    DWORD dwResult; 

    HMODULE hLib = LoadLibrary("iphlpapi.dll"); 

    pGetExtendedTcpTable = (DWORD (WINAPI *)(PVOID,PDWORD,BOOL,ULONG,TCP_TABLE_CLASS,ULONG)) 
     GetProcAddress(hLib, "GetExtendedTcpTable"); 

    dwResult = pGetExtendedTcpTable(NULL,  &size, false, AF_INET, TCP_TABLE_OWNER_PID_LISTENER, 0); 
    pTCPInfo = (MIB_TCPTABLE_OWNER_PID*)malloc(size); 
    dwResult = pGetExtendedTcpTable(pTCPInfo, &size, false, AF_INET, TCP_TABLE_OWNER_PID_LISTENER, 0);  
    for (DWORD dwLoop = 0; dwLoop < pTCPInfo->dwNumEntries; dwLoop++) 
    { 
     owner = &pTCPInfo->table[dwLoop];  
     ApplicationName = GetNameByPID(owner->dwOwningPid); 
     OpenedPort = convertInt(ntohs(owner->dwLocalPort));   
     RemotePort = convertInt(ntohs(owner->dwRemotePort)); 
     aux = "TCP ; " + OpenedPort + ";"+ RemotePort+";"+ ApplicationName + "\n"; 
     result = result + aux; 

    } 
    return result; 
} 

Но, если сравнить результат с результатом netstat -ano эта функция не возвращает все порты TCP.

ответ

3

Используйте TCP_TABLE_OWNER_PID_ALL вместо TCP_TABLE_OWNER_PID_LISTENER, и вы получите все порты TCP.

+0

Может кто-то указать на пример кода для использования TCP_TABLE_OWNER_PID_ALL .... – shivi