From 6d75eac8317c6d411429817e140d9d1e0d7dedb4 Mon Sep 17 00:00:00 2001 From: MaxXor Date: Wed, 10 Jun 2015 15:24:18 +0200 Subject: [PATCH] Fixed situations which could break the server --- Server/Core/Networking/Client.cs | 1 + Server/Core/Networking/Server.cs | 45 ++++++++++++++++++++------------ 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/Server/Core/Networking/Client.cs b/Server/Core/Networking/Client.cs index 620f0c77..009639a3 100644 --- a/Server/Core/Networking/Client.cs +++ b/Server/Core/Networking/Client.cs @@ -426,6 +426,7 @@ public void Disconnect() if (_handle != null) { + _handle.Shutdown(SocketShutdown.Both); _handle.Close(); _readOffset = 0; _writeOffset = 0; diff --git a/Server/Core/Networking/Server.cs b/Server/Core/Networking/Server.cs index c2858d27..3d7660b8 100644 --- a/Server/Core/Networking/Server.cs +++ b/Server/Core/Networking/Server.cs @@ -311,29 +311,37 @@ private void Process(object s, SocketAsyncEventArgs e) { try { - if (e.SocketError == SocketError.Success) + do { - Client client = new Client(this, e.AcceptSocket, PacketTypes.ToArray()); - - lock (_clientsLock) + switch (e.SocketError) { - _clients.Add(client); - client.ClientState += OnClientState; - client.ClientRead += OnClientRead; - client.ClientWrite += OnClientWrite; + case SocketError.Success: + if (BufferManager.BuffersAvailable == 0) + BufferManager.IncreaseBufferCount(1); - if (BufferManager.BuffersAvailable == 0) - BufferManager.IncreaseBufferCount(1); + Client client = new Client(this, e.AcceptSocket, PacketTypes.ToArray()); - OnClientState(client, true); + lock (_clientsLock) + { + _clients.Add(client); + client.ClientState += OnClientState; + client.ClientRead += OnClientRead; + client.ClientWrite += OnClientWrite; + + OnClientState(client, true); + } + break; + case SocketError.ConnectionReset: + break; + default: + throw new SocketException(); } - e.AcceptSocket = null; - if (!_handle.AcceptAsync(e)) - Process(null, e); - } - else - Disconnect(); + e.AcceptSocket = null; // enable reuse + } while (!_handle.AcceptAsync(e)); + } + catch (ObjectDisposedException ex) + { } catch (Exception ex) { @@ -383,7 +391,10 @@ public void Disconnect() Processing = true; if (_handle != null) + { + _handle.Shutdown(SocketShutdown.Both); _handle.Close(); + } lock (_clientsLock) {