c++ - GetExtendedTcpTable 不会返回与 netstat -ano 相同的结果

标签 c++ windows mfc ports netstat

我使用此代码获取我的 PC 中已打开端口的列表以及使用每个端口的应用程序。

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 端口。

最佳答案

使用 TCP_TABLE_OWNER_PID_ALL 代替 TCP_TABLE_OWNER_PID_LISTENER,您将获得所有 TCP 端口。

关于c++ - GetExtendedTcpTable 不会返回与 netstat -ano 相同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15573504/

相关文章:

c++ - 套接字和队列问题

c++ - 未能从 lambda 函数中推断出模板参数 std::function

c++ - 我如何通过 map 的严格弱排序对数学 vector 进行排序?

python - 让 python 应用程序访问存储在 Windows 证书管理器中的证书

windows - 今天在 “xxx” 文件夹中找到包含 “yyy” 字符串的文件,并使用批处理脚本将这些文件复制到 “zzz” 文件夹

c++ - 返回 CArray 的问题

c++ - MFC分配大内存

mfc - 如何正确捕获 Aero/DWM 上的特定窗口

c++ - 全局更改 gcc 包含路径

c++ - 我如何让这个 C++ 计算程序留在控制台上?