6

我正在尝试启动一个进程并告诉它使用未使用的 TCP 端口。不幸的是,我正在启动的二进制文件不会探测未使用的端口。我有没有一种体面的方法来探测 Dart 中的端口,以便我可以将其用作我的进程的参数?

我能想到的最好的方法是创建一个ServerSocket端口为 0 的端口,然后关闭套接字并使用它的端口,但这对我来说似乎很棘手。

有人有更好的方法吗?

4

2 回答 2

4

我将添加我的“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;
  });
}
于 2012-12-30T23:46:58.637 回答
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;
}
于 2020-05-28T23:30:17.200 回答