diff --git a/Projects/Server/Network/NetState.cs b/Projects/Server/Network/NetState.cs index c85b4841c..993e213d9 100644 --- a/Projects/Server/Network/NetState.cs +++ b/Projects/Server/Network/NetState.cs @@ -423,6 +423,12 @@ namespace Server.Network ConnectedOn = DateTime.UtcNow; + connection.ConnectionClosed.Register(() => + { + TcpServer.Instances.Remove(this); + Dispose(); + }); + CreatedCallback?.Invoke(this); } @@ -482,6 +488,41 @@ namespace Server.Network } } + public async Task ProcessIncoming(IMessagePumpService messagePumpService) + { + var inPipe = Connection.Transport.Input; + + while (true) + { + if (AsyncState.Paused) + continue; + + try + { + var result = await inPipe.ReadAsync(); + if (result.IsCanceled || result.IsCompleted) + return; + + var seq = result.Buffer; + + if (seq.IsEmpty) + break; + + var pos = PacketHandlers.ProcessPacket(messagePumpService, this, seq); + + if (pos <= 0) + break; + + inPipe.AdvanceTo(seq.Slice(0, pos).End); + } + catch + { + // ignored + break; + } + } + } + public bool CheckEncrypted(int packetID) { if (!SentFirstPacket && packetID != 0xF0 && packetID != 0xF1 && packetID != 0xCF && packetID != 0x80 && @@ -533,6 +574,8 @@ namespace Server.Network try { + Connection.Transport.Input.Complete(); + Connection.Transport.Output.Complete(); Connection.Abort(); Task.Run(Connection.DisposeAsync).Wait(); } diff --git a/Projects/Server/Network/ServerConnectionHandler.cs b/Projects/Server/Network/ServerConnectionHandler.cs index 8e4b3c26d..c8567206c 100644 --- a/Projects/Server/Network/ServerConnectionHandler.cs +++ b/Projects/Server/Network/ServerConnectionHandler.cs @@ -20,6 +20,7 @@ *************************************************************************/ using System; +using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Connections; using Microsoft.Extensions.Logging; @@ -49,47 +50,9 @@ namespace Server.Network var ns = new NetState(connection); TcpServer.Instances.Add(ns); - _logger.LogInformation($"Client: {ns}: Connected. [{TcpServer.Instances.Count} Online]"); + Console.WriteLine($"Client: {ns}: Connected. [{TcpServer.Instances.Count} Online]"); - connection.ConnectionClosed.Register(() => { TcpServer.Instances.Remove(ns); }); - - await ProcessIncoming(ns).ConfigureAwait(false); - } - - private async Task ProcessIncoming(NetState ns) - { - var inPipe = ns.Connection.Transport.Input; - - while (true) - { - if (NetState.AsyncState.Paused) - continue; - - try - { - var result = await inPipe.ReadAsync(); - if (result.IsCanceled || result.IsCompleted) - return; - - var seq = result.Buffer; - - if (seq.IsEmpty) - break; - - var pos = PacketHandlers.ProcessPacket(_messagePumpService, ns, seq); - - if (pos <= 0) - break; - - inPipe.AdvanceTo(seq.Slice(0, pos).End); - } - catch - { - // ignored - } - } - - inPipe.Complete(); + await ns.ProcessIncoming(_messagePumpService).ConfigureAwait(false); } private static bool VerifySocket(ConnectionContext connection) diff --git a/Projects/Server/Network/TcpServer.cs b/Projects/Server/Network/TcpServer.cs index a21067603..8778bae98 100644 --- a/Projects/Server/Network/TcpServer.cs +++ b/Projects/Server/Network/TcpServer.cs @@ -37,6 +37,8 @@ namespace Server.Network // Make this thread safe public static List Instances { get; } = new List(); + private static IPAddress[] m_ListeningAddresses; + public static IWebHostBuilder CreateWebHostBuilder(string[] args = null) => WebHost.CreateDefaultBuilder(args) .UseSetting(WebHostDefaults.SuppressStatusMessagesKey, "True") @@ -46,6 +48,7 @@ namespace Server.Network foreach (var ipep in Listeners) { options.Listen(ipep, builder => { builder.UseConnectionHandler(); }); + m_ListeningAddresses = GetListeningAddresses(ipep); DisplayListener(ipep); } @@ -54,23 +57,30 @@ namespace Server.Network .UseLibuv() .UseStartup(); + public static IPAddress[] GetListeningAddresses(IPEndPoint ipep) + { + if (m_ListeningAddresses != null) + return m_ListeningAddresses; + + var list = new List(); + foreach (var adapter in NetworkInterface.GetAllNetworkInterfaces()) + { + var properties = adapter.GetIPProperties(); + foreach (var unicast in properties.UnicastAddresses) + if (ipep.AddressFamily == unicast.Address.AddressFamily) + list.Add(unicast.Address); + } + + return list.ToArray(); + } + private static void DisplayListener(IPEndPoint ipep) { if (ipep.Address.Equals(IPAddress.Any) || ipep.Address.Equals(IPAddress.IPv6Any)) - { - var adapters = NetworkInterface.GetAllNetworkInterfaces(); - foreach (var adapter in adapters) - { - var properties = adapter.GetIPProperties(); - foreach (var unicast in properties.UnicastAddresses) - if (ipep.AddressFamily == unicast.Address.AddressFamily) - Console.WriteLine("Listening: {0}:{1}", unicast.Address, ipep.Port); - } - } + foreach (var ip in m_ListeningAddresses) + Console.WriteLine("Listening: {0}:{1}", ip, ipep.Port); else - { Console.WriteLine("Listening: {0}:{1}", ipep.Address, ipep.Port); - } } } } diff --git a/Projects/Server/Server.csproj b/Projects/Server/Server.csproj index 629e33fbc..b07198e22 100644 --- a/Projects/Server/Server.csproj +++ b/Projects/Server/Server.csproj @@ -62,11 +62,11 @@ $(SolutionDir)\Rules.ruleset - + libdrng.dll Always - + zlib.dll Always diff --git a/Tools/publish-windows-debug.sh b/Tools/publish-windows-debug.sh index 4d8f0d044..1a0b31cc8 100755 --- a/Tools/publish-windows-debug.sh +++ b/Tools/publish-windows-debug.sh @@ -1 +1 @@ -dotnet -c Release Debug /p:PublishProfile=Windows +dotnet publish -c Debug /p:PublishProfile=Windows diff --git a/Tools/publish-windows.sh b/Tools/publish-windows.sh index c7b2be398..5b51c26c6 100755 --- a/Tools/publish-windows.sh +++ b/Tools/publish-windows.sh @@ -1 +1 @@ -dotnet -c Release Publish /p:PublishProfile=Windows +dotnet publish -c Release /p:PublishProfile=Windows