in lib/http_multi_server.dart [202:231]
static Future<HttpServer> _loopback(
int port, Future<HttpServer> Function(InternetAddress, int port) bind,
[int remainingRetries = 5]) async {
if (!await supportsIPv4) {
return await bind(InternetAddress.loopbackIPv6, port);
}
var v4Server = await bind(InternetAddress.loopbackIPv4, port);
if (!await supportsIPv6) return v4Server;
try {
// Reuse the IPv4 server's port so that if [port] is 0, both servers use
// the same ephemeral port.
var v6Server = await bind(InternetAddress.loopbackIPv6, v4Server.port);
return HttpMultiServer([v4Server, v6Server]);
} on SocketException catch (error) {
// If there is already a server listening we'll lose the reference on a
// rethrow.
await v4Server.close();
if (error.osError?.errorCode != _addressInUseErrno) rethrow;
if (port != 0) rethrow;
if (remainingRetries == 0) rethrow;
// A port being available on IPv4 doesn't necessarily mean that the same
// port is available on IPv6. If it's not (which is rare in practice),
// we try again until we find one that's available on both.
return await _loopback(port, bind, remainingRetries - 1);
}
}