在Python中使用GetExtendedTcpTable

0 投票
2 回答
966 浏览
提问于 2025-04-15 14:21

我正在尝试通过一个Python程序使用GetExtendedTcpTable。简单来说,我想把“ActiveState Code Recipe 392572: 使用Win32 IPHelper API”的内容转换成“通过GetExtendedTcpTable函数获取活动的TCP/UDP连接”

我遇到的问题是,Python脚本似乎无法识别TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL。

我试过以下代码:

ctypes.windll.iphlpapi.GetExtendedTcpTable(NULL, ctypes.byref(dwSize), bOrder, AF_INET, TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL, 0)

但是这总是报错,提示“AttributeError: function 'TCP_TABLE_CLASS' not found”。

我还试过:

ctypes.windll.iphlpapi.GetExtendedTcpTable(NULL, ctypes.byref(dwSize), bOrder, AF_INET, ctypes.windll.iphlpapi.TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL, 0)

结果也是一样。

如果有任何建议,我会很感激。

切入点

2 个回答

0

在这种情况下,因为:

这里定义了一个枚举类型,叫做 TCP_TABLE_CLASS,里面有几个选项,比如:

  • TCP_TABLE_BASIC_LISTENER
  • TCP_TABLE_BASIC_CONNECTIONS
  • TCP_TABLE_BASIC_ALL
  • TCP_TABLE_OWNER_PID_LISTENER
  • TCP_TABLE_OWNER_PID_CONNECTIONS
  • TCP_TABLE_OWNER_PID_ALL
  • TCP_TABLE_OWNER_MODULE_LISTENER
  • TCP_TABLE_OWNER_MODULE_CONNECTIONS
  • TCP_TABLE_OWNER_MODULE_ALL

这个枚举类型就像是一个列表,里面列出了不同的选项。

我用了数字 '5',结果成功了。

谢谢,

Cutaway

1

TCP_TABLE_CLASS 是一个枚举类型

typedef enum  {
  TCP_TABLE_BASIC_LISTENER,
  TCP_TABLE_BASIC_CONNECTIONS,
  TCP_TABLE_BASIC_ALL,
  TCP_TABLE_OWNER_PID_LISTENER,
  TCP_TABLE_OWNER_PID_CONNECTIONS,
  TCP_TABLE_OWNER_PID_ALL,
  TCP_TABLE_OWNER_MODULE_LISTENER,
  TCP_TABLE_OWNER_MODULE_CONNECTIONS,
  TCP_TABLE_OWNER_MODULE_ALL 
} TCP_TABLE_CLASS, *PTCP_TABLE_CLASS;

你需要在你的 Python 脚本里定义它,并给它一些常量。这些内容并不是由 dll 文件提供的。

  TCP_TABLE_BASIC_LISTENER = 0
  TCP_TABLE_BASIC_CONNECTIONS = 1
  TCP_TABLE_BASIC_ALL = 2
  TCP_TABLE_OWNER_PID_LISTENER = 3
  TCP_TABLE_OWNER_PID_CONNECTIONS = 4
  TCP_TABLE_OWNER_PID_ALL = 5
  TCP_TABLE_OWNER_MODULE_LISTENER = 6
  TCP_TABLE_OWNER_MODULE_CONNECTIONS = 7
  TCP_TABLE_OWNER_MODULE_ALL = 8

撰写回答