如何在python中选择一个空闲端口号? [复制]

Posted

技术标签:

【中文标题】如何在python中选择一个空闲端口号? [复制]【英文标题】:How to pick a free port number in python? [duplicate] 【发布时间】:2012-01-25 20:45:26 【问题描述】:

可能重复:On localhost, how to pick a free port number?

我的要求与这个问题不同。

On localhost, how to pick a free port number?

我正在使用 python 编写另一个进程的测试设置。另一个进程需要传递一个端口号(比如作为命令行参数)。我不能硬编码一些随机端口号,因为许多用户通常会在同一个盒子中运行相同的测试。现在,如何在 python 中选择一个空闲端口?

编辑:

我没有在 python 中创建套接字。我只需要将一个数字作为命令行参数传递给其他进程。

根据 DRH 的回答, 我可以创建一个虚拟套接字,获取它的端口号,关闭它并传递给实际进程。有没有更好的方法来做到这一点?

【问题讨论】:

您的要求有何不同? 我没有在 python 中创建套接字。那么如何要求操作系统提供免费端口呢?我只需要将这个数字作为命令行参数传递给其他进程。 我不确定是否要向操作系统询问可用端口号。如果您多次询问而不打开套接字怎么办?是否保证每次请求都会获得不同的端口号? 在我询问一次并在该端口上运行我的进程之后。它不再是免费的。那么我不会为不同的进程获得不同的端口吗? @balki - 即使操作系统现在告诉你一个空闲端口,也不能保证它会在 100 毫秒后空闲。至少使用“获取端口”方法,在该端口下一次绑定到服务器套接字之前应该有一个超时。 【参考方案1】:

按照您的要求,可能没有一种安全的方法。即使操作系统可以向您返回当前空闲的端口,也不能保证在您请求端口和您调用的应用程序尝试绑定到它的时间之间,另一个进程不会将套接字绑定到该端口。

鉴于此,如果您只是在寻找可能空闲的端口,您可以绑定到端口 0,如此处所述 On localhost, how to pick a free port number?,关闭生成的套接字(释放端口),然后传递该值到您的应用程序。

【讨论】:

我认为同时获得该端口的另一个进程很少见。所以我会接受它。无论如何,我期待一种更好的方式来询问操作系统,而不是创建一个虚拟套接字并关闭它。 作为记录,这是该建议的实施:gist.github.com/3979133

以上是关于如何在python中选择一个空闲端口号? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

系统RPC服务存在异常

TCP socket编程中如何让内核在(1024,5000)范围内选择一个端口号

TCP socket编程中如何让内核在(1024,5000)范围内选择一个端口号

xmlrpc - 动态选择端口号

请问如何扫描指定IP地址的端口号

.NET开发服务器的localhost端口号如何设置?