Meum/Meum.Server/Program.cs
2024-10-22 13:16:20 +05:00

70 lines
2.7 KiB
C#

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);
}
}
}