在Python中使用GetExtendedTcpTable
我正在尝试通过一个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 个回答
在这种情况下,因为:
这里定义了一个枚举类型,叫做 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
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