From 2b54372249d2883b73389bf59f134bd0e89553be Mon Sep 17 00:00:00 2001 From: krrios Date: Wed, 25 Apr 2007 05:54:23 +0000 Subject: [PATCH] initial attempt at socket pooling -- DOES NOT WORK -- EVIL CODE -- DO NOT RUN LIVE -- etc --- Server/Network/Listener.cs | 115 +++++++++++++++++++++-------------- Server/Network/NetState.cs | 19 ++++++ Server/Network/SocketPool.cs | 2 + 3 files changed, 91 insertions(+), 45 deletions(-) diff --git a/Server/Network/Listener.cs b/Server/Network/Listener.cs index 72a1fe602..1d8d9e51b 100644 --- a/Server/Network/Listener.cs +++ b/Server/Network/Listener.cs @@ -23,6 +23,7 @@ using System.Collections; using System.Collections.Generic; using System.Net; using System.Net.Sockets; +using System.Threading; using Server; namespace Server.Network @@ -103,55 +104,87 @@ namespace Server.Network Console.WriteLine( "Listener bind exception:" ); Console.WriteLine( e ); - try { s.Shutdown( SocketShutdown.Both ); } - catch{} - - s.BeginDisconnect( true, m_OnDisconnect, s ); - return null; } } - private void OnAccept( IAsyncResult asyncResult ) - { - Socket listener = (Socket)asyncResult.AsyncState; + private void OnAccept( IAsyncResult asyncResult ) { + Socket listener = (Socket) asyncResult.AsyncState; - try - { - Socket socket = listener.EndAccept( asyncResult ); + Socket accepted = null; - SocketConnectEventArgs e = new SocketConnectEventArgs( socket ); - EventSink.InvokeSocketConnect( e ); + try { + accepted = listener.EndAccept( asyncResult ); + } catch ( SocketException ex ) { + NetState.TraceException( ex ); + } catch ( ObjectDisposedException ) { + return; + } - if ( e.AllowConnection ) { - lock ( m_AcceptedSyncRoot ) - m_Accepted.Enqueue( socket ); - } - else { - try { socket.Shutdown( SocketShutdown.Both ); } - catch { } - - socket.BeginDisconnect( true, m_OnDisconnect, socket ); + if ( accepted != null ) { + if ( VerifySocket( accepted ) ) { + Enqueue( accepted ); + } else { + Release( accepted ); } } - catch - { + + try { + listener.BeginAccept( SocketPool.AcquireSocket(), 0, m_OnAccept, listener ); + } catch ( SocketException ex ) { + NetState.TraceException( ex ); + } catch ( ObjectDisposedException ) { } - finally - { - IAsyncResult res = listener.BeginAccept( SocketPool.AcquireSocket(), 0, m_OnAccept, listener ); + } + + private bool VerifySocket( Socket socket ) { + try { + SocketConnectEventArgs args = new SocketConnectEventArgs( socket ); + + EventSink.InvokeSocketConnect( args ); + + return args.AllowConnection; + } catch ( Exception ex ) { + NetState.TraceException( ex ); + + return false; + } + } + + private void Enqueue( Socket socket ) { + lock ( m_AcceptedSyncRoot ) { + m_Accepted.Enqueue( socket ); } Core.Set(); } - private void OnDisconnect( IAsyncResult asyncResult ) - { - Socket s = (Socket)asyncResult.AsyncState; + private void Release( Socket socket ) { + try { + socket.Shutdown( SocketShutdown.Both ); + } catch ( SocketException ex ) { + NetState.TraceException( ex ); + } - s.EndDisconnect( asyncResult ); + try { + socket.BeginDisconnect( true, m_OnDisconnect, socket ); + } catch ( SocketException ex ) { + NetState.TraceException( ex ); + } + } - SocketPool.ReleaseSocket( s ); + private void OnDisconnect( IAsyncResult asyncResult ) { + Socket socket = (Socket) asyncResult.AsyncState; + + try { + socket.EndDisconnect( asyncResult ); + + SocketPool.ReleaseSocket( socket ); + } catch ( SocketException ex ) { + NetState.TraceException( ex ); + } catch ( ObjectDisposedException ex ) { + NetState.TraceException( ex ); + } } public Socket[] Slice() @@ -170,21 +203,13 @@ namespace Server.Network return array; } - public void Dispose() - { - if ( !m_Disposed ) - { - m_Disposed = true; + public void Dispose() { + m_Disposed = true; - if ( m_Listener != null ) - { - try { m_Listener.Shutdown( SocketShutdown.Both ); } - catch {} + Socket socket = Interlocked.Exchange( ref m_Listener, null ); - m_Listener.BeginDisconnect( true, m_OnDisconnect, m_Listener ); - - m_Listener = null; - } + if ( socket != null ) { + socket.Close(); } } } diff --git a/Server/Network/NetState.cs b/Server/Network/NetState.cs index 21d6fbfa2..28175992c 100644 --- a/Server/Network/NetState.cs +++ b/Server/Network/NetState.cs @@ -752,6 +752,25 @@ namespace Server.Network { Dispose( true ); } + public static void TraceException( Exception ex ) { + try { + using ( StreamWriter op = new StreamWriter( "network-errors.log", true ) ) { + op.WriteLine( "# {0}", DateTime.UtcNow ); + + op.WriteLine( ex ); + + op.WriteLine(); + op.WriteLine(); + } + } catch { + } + + try { + Console.WriteLine( ex ); + } catch { + } + } + private bool m_Disposing; public virtual void Dispose( bool flush ) { diff --git a/Server/Network/SocketPool.cs b/Server/Network/SocketPool.cs index 0a1e1fe58..fea1bce01 100644 --- a/Server/Network/SocketPool.cs +++ b/Server/Network/SocketPool.cs @@ -94,6 +94,8 @@ namespace Server.Network if ( s == null ) return; + s.Close(); + lock ( m_FreeSockets ) m_FreeSockets.Enqueue( s ); }