global using System; global using System.Collections.Generic; global using System.Threading; global using System.Threading.Tasks; global using Meum.Core; using System.IO; using System.Linq; using System.Net; using System.Net.Quic; using System.Net.Security; using System.Runtime.Serialization; using System.Security.Cryptography.X509Certificates; using DTLib.Console; using DTLib.Demystifier; using DTLib.Extensions; namespace Meum.Server; class Program { static async Task Main(string[] args) { try { var config = new Config(); var certificate = X509Certificate2.CreateFromPemFile(config.certificate_path, config.key_path); if(!certificate.Verify()) throw new Exception("Certificate is not valid"); var serverConnectionOptions = new QuicServerConnectionOptions { DefaultStreamErrorCode = Network.DefaultStreamErrorCode, DefaultCloseErrorCode = Network.DefaultCloseErrorCode, ServerAuthenticationOptions = new SslServerAuthenticationOptions { ApplicationProtocols = Network.ApplicationProtocols.ToList(), ServerCertificate = certificate, ClientCertificateRequired = false } }; var listenerOptions = new QuicListenerOptions { ListenEndPoint = new IPEndPoint(IPAddress.Parse(config.listener_ip), config.listener_port), ApplicationProtocols = Network.ApplicationProtocols.ToList(), ConnectionOptionsCallback = (_, _, _) => ValueTask.FromResult(serverConnectionOptions) }; var listener = await QuicListener.ListenAsync(listenerOptions); while (true) { try { var conn = await listener.AcceptConnectionAsync(); var stream = await conn.AcceptInboundStreamAsync(); StreamReader reader = new(stream); string line = await reader.ReadLineAsync() ?? ""; Console.WriteLine(line); await stream.WriteAsync("Pong\n".ToBytes()); await conn.CloseAsync(Network.DefaultCloseErrorCode); } catch (Exception ex) { ColoredConsole.WriteLine(ex.ToStringDemystified(), ConsoleColor.Red); } } } catch (Exception ex) { ColoredConsole.WriteLine(ex.ToStringDemystified(), ConsoleColor.Red); } } }