プロセスを起動して、未使用のTCPポートを使用するように指示しようとしています。残念ながら、私が開始しているバイナリは、未使用のポートをプローブしません。Dartのポートをプローブして、プロセスの引数として使用できるようにするための適切な方法はありますか?
私が考えることができる最善の方法はServerSocket
、ポートが0のを作成し、ソケットを閉じてそのポートを使用することですが、これは私にはハッキーに思えます。
誰かもっと良い方法がありますか?
プロセスを起動して、未使用のTCPポートを使用するように指示しようとしています。残念ながら、私が開始しているバイナリは、未使用のポートをプローブしません。Dartのポートをプローブして、プロセスの引数として使用できるようにするための適切な方法はありますか?
私が考えることができる最善の方法はServerSocket
、ポートが0のを作成し、ソケットを閉じてそのポートを使用することですが、これは私にはハッキーに思えます。
誰かもっと良い方法がありますか?
別の方法を考えることができないので、答えとして「ハック」を追加します。これはかなりうまく機能しているようです。
これが私の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;
});
}
ソケットが閉じられると、別のプロセスがポートを再利用できるため、上記は際どいものです。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;
}