// Copyright (C) 2026 SharpEmu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later using System.Net; namespace SharpEmu.Debugger.Server; /// Network configuration for a . public sealed class DebuggerServerOptions { /// The default TCP port the debug server listens on. public const int DefaultPort = 5714; /// /// The address to bind. Defaults to loopback so the debug surface is not /// exposed off-box; a caller must opt in to a routable address explicitly. /// public IPAddress BindAddress { get; init; } = IPAddress.Loopback; /// The TCP port to listen on. public int Port { get; init; } = DefaultPort; /// /// The maximum number of simultaneous client connections. Additional /// connections wait in the accept backlog. /// public int MaxClients { get; init; } = 4; /// /// Parses a host:port, bare port, or bare host into options. /// Returns false when the text cannot be interpreted. /// public static bool TryParseEndpoint(string? text, out DebuggerServerOptions options, out string error) { options = new DebuggerServerOptions(); error = string.Empty; if (string.IsNullOrWhiteSpace(text)) { return true; } var value = text.Trim(); var host = value; var port = DefaultPort; var separator = value.LastIndexOf(':'); if (separator >= 0) { var portText = value[(separator + 1)..]; if (portText.Length > 0) { if (!int.TryParse(portText, out port) || port is <= 0 or > 65535) { error = $"Invalid port '{portText}'."; return false; } } host = value[..separator]; } var address = IPAddress.Loopback; if (!string.IsNullOrWhiteSpace(host) && !string.Equals(host, "localhost", StringComparison.OrdinalIgnoreCase) && !IPAddress.TryParse(host, out address!)) { error = $"Invalid bind address '{host}'."; return false; } options = new DebuggerServerOptions { BindAddress = address ?? IPAddress.Loopback, Port = port, }; return true; } }