我正在尝试启动一个进程并告诉它使用未使用的TCP端口。不幸的是,我启动的二进制文件不会探测未使用的端口。有没有一个像样的方法来探测Dart中的端口,以便我可以将其用作我的进程的参数?
我能想到的最好的方法是创建一个端口为0的ServerSocket
,然后关闭套接字并使用它的端口,但这对我来说似乎很烦人。
任何人都有更好的方法吗?
答案 0 :(得分:3)
我会将我的'hack'添加为答案,因为我无法想到另一种方式,而且它看起来效果很好。
这是我的getUnusedPort()
功能:
import 'dart:io';
Future<int> getUnusedPort(InternetAddress address) {
return ServerSocket.bind(address ?? InternetAddress.anyIPv4, 0).then((socket) {
var port = socket.port;
socket.close();
return port;
});
}
答案 1 :(得分:0)
上面是合理的,因为一旦关闭套接字,另一个进程可以回收该端口。使用https://chromium.googlesource.com/external/github.com/dart-lang/test/+/master/pkgs/test_core/lib/src/util/io.dart#147
中的模式Future<T> getUnusedPort<T>(FutureOr<T> Function(int port) tryPort) async {
T value;
await Future.doWhile(() async {
value = await tryPort(await getUnsafeUnusedPort());
return value == null;
});
return value;
}