【发布时间】:2017-12-06 02:57:40
【问题描述】:
我正在围绕 Appium 服务器编写 Python 包装器。 Appium 接受要绑定到的本地端口的命令行参数。不幸的是,Appium 不能为自己自动选择一个空闲端口,所以它要么绑定到明确指定的端口,要么失败并显示EADDRINUSE。即使告诉它绑定到端口0,它也会成功启动,但不会显示它绑定到的端口。
如果我自己在 Python 包装器中找到了一个空闲端口,则无法保证在我将它传递给 Appium 的同时,其他一些进程不会绑定到同一个端口。而且如果我自己不先发布,Appium就无法绑定,所以我必须要。
我知道这在实践中不太可能发生,但是在以跨平台方式(Linux、macOS、Windows)将本地端口号传递给另一个进程之前“保留”本地端口号的“正确方法”是什么? ?
【问题讨论】:
-
你也许可以选择一个随机端口,将它传递给 Appium,然后检查正确的错误消息。
-
你不能尝试一个任意端口,如果它返回
EADDRINUSE,则增加它并循环直到找到一个空闲端口? -
@AlexHall,这就是我现在正在做的事情。然而,问题是关于“正确的方式”——例如。有没有办法为子进程保留端口号?
-
@rodrigo,如果我是唯一将使用该端口的人,这将起作用。但是我想将它传递给 Appium,所以我必须先释放它,然后,当 Appium 启动时,其他进程可能会占用它(因为我正在运行许多具有动态分配端口的服务器)。
-
@toriningen:啊,一个沉重的服务器......我实际上对Appium一无所知,但无论如何我都会建议。如果
0启动成功,我可以想到两个解决方案: 1. 给Appium打补丁报告使用的端口(毕竟是开源的); 2.使用lsof -p <pid> -i4 -P -n | grep LISTEN之类的命令来发现它正在使用的端口。
标签: python linux macos networking network-programming