列举同一进程中的开放端口。

3

在Windows中,有没有一种方法可以枚举进程正在使用的所有打开的端口/套接字?我正在尝试追踪我的应用程序中的高端口使用率,但是我的应用程序使用非常少的端口,因此必须是加载到进程中的其他DLL。


我建议使用WinDbg,并在wsock32.dll中的socket()(以及WSASocket())上设置断点。当你触发断点时,检查调用树。 - undefined
这只会告诉你哪些模块正在创建套接字,而不是它们使用的IP/端口。要获取该信息,你需要钩住bind()accept()WSAAccept()函数。 - undefined
@Remy:据我所知,他的问题的关键是要弄清楚他的应用程序做了什么导致端口被打开(通过一个库)。可以通过在每个库调用之前和之后获取端口列表,并观察列表何时增长来解决这个问题... 或者更容易地通过设置断点来实现。专注于解决问题,而不是问题中提出的方法。 - undefined
1个回答

4

Windows自带的命令行工具netstat,以及SysInternals的TCPView应用程序,都可以显示拥有每个打开端口的进程名称。

如果您想以编程方式枚举此信息,则必须手动枚举Windows的端口路由表并将其映射到您的进程。 在XP上,您可以使用AllocateAndGetTcpExTableFromStack()AllocateAndGetUdpExTableFromStack()。 在Vista及更高版本中,您可以使用GetExtendedTcpTable()GetExtendedUdpTable()代替。 两组函数均可返回每个打开IP / Port的Process ID,您可以将其与GetCurrentProcessId()的结果进行比较。


但是他不知道他的进程正在使用哪些端口,这就是他提出问题的关键。我提到的API函数可以用来确定这些信息。 - undefined
谢谢Remy - 这正是我需要的(编程访问,这样我就可以记录在客户现场运行的端口)。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接