using System.Net; using System.Net.Sockets; using DX86.Modules; namespace DX86; using System.Net.Sockets; public abstract class TcpServer { private string address; private int port; protected MessageSender ms; private DX86 dx86; public List optionsList; public TcpServer(string address, int port, MessageSender ms) { ms.Log("[DX86] Setting up server."); this.address = address; this.port = port; this.ms = ms; optionsList = new List(); this.dx86 = new DX86(ms, ServerType.TCP); optionsList.Add("cancel"); ms.Log("[DX86] Server Setup Complete."); _ = RunServer(); } private async Task RunServer() { ms.Log("[DX86] Starting server."); // Subscribe to events dx86.ClientConnected += ClientConnectEvent; dx86.MessageReceived += MessageReceivedEvent; dx86.ClientDisconnected += ClientDisconnectEvent; // Start the server dx86.StartServer(address, port); ms.Log("[DX86] Server started."); // Keep the server running indefinitely await Task.Delay(Timeout.Infinite); } public void StopServer() { ms.Log("[DX86] Got Signal to Stop Server."); dx86.StopServer(); ms.Log("[DX86] Server stopped."); } public string GetAddress() { return address; } public int GetPort() { return port; } public void SendMessageAsync(TcpClient client, string message) { dx86.SendMessageAsync(client, message); } public void BroadcastMessageAsync(TcpClient sender, string message) { dx86.BroadcastMessage(message, sender); } public IPEndPoint GetClientEndPoint(TcpClient client) { if (client == null) { return null; } if (!client.Connected) { return null; } // Get the remote endpoint, cast it to IPEndPoint IPEndPoint remoteEndPoint = client.Client.RemoteEndPoint as IPEndPoint; if (remoteEndPoint != null) { // Return the IP address and port return remoteEndPoint; } return null; } public abstract string ToggleOption(string option, string value); public abstract List> ConfigureOptions(string option); // Define your event handlers protected abstract void ClientConnectEvent(TcpClient client); protected abstract void MessageReceivedEvent(TcpClient client, string message); protected abstract void ClientDisconnectEvent(TcpClient client); }