public Server(int expectedNumberOfConnections, int receiveBufferSize) { _listeningSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); _expectedNumberOfConnections = expectedNumberOfConnections; _receiveBufferSize = receiveBufferSize; _bufferManager = new BufferManager(receiveBufferSize * expectedNumberOfConnections * OpsToPreAlloc, receiveBufferSize, true); _bufferManager.InitBuffer(); _acceptEvtArgsPool = new ThreadSafePool<SocketAsyncEventArgs>(10); _readWriteEvtArgsPool = new ThreadSafePool<SocketAsyncEventArgs>(expectedNumberOfConnections); for (int i = 0; i < _expectedNumberOfConnections; i++) { SocketAsyncEventArgs readWriteEvtArg = new SocketAsyncEventArgs(); _bufferManager.SetBuffer(readWriteEvtArg); readWriteEvtArg.Completed += IOCompleted; _readWriteEvtArgsPool.Push(readWriteEvtArg); } for (int i = 0; i < 10; i++) { SocketAsyncEventArgs acceptEvtArg = new SocketAsyncEventArgs(); acceptEvtArg.Completed += AcceptCompleted; _acceptEvtArgsPool.Push(acceptEvtArg); } }
public BufferManager(int totalBytes, int bufferSize, bool autoGrowth) { _totalBytes = totalBytes; _currentIndex = 0; _bufferSize = bufferSize; _freeIndexesPool = new ThreadSafePool<int>(totalBytes / bufferSize); _autogrowth = autoGrowth; }
public static PacketObject Create(Type type = null) { var hash = type.GetHashCode(); var p = m_pool.Get(hash); if (p == null) { p = new ThreadSafePool <PacketObject>(MAX_POOL_SIZE, type); m_pool.Add(hash, p); } var packet = p.Pop(); packet.destroyed = false; packet.dontDestroyOnSend = false; packet.dontDestroyOnRecv = false; return(packet); }
public static T Create <T>() where T : PacketObject { var t = typeof(T); var hash = t.GetHashCode(); var p = m_pool.Get(hash); if (p == null) { p = new ThreadSafePool <PacketObject>(MAX_POOL_SIZE, t); m_pool.Add(hash, p); } var packet = (T)p.Pop(); packet.destroyed = false; packet.dontDestroyOnSend = false; packet.dontDestroyOnRecv = false; return(packet); }
public static void Init(int count, int blocksize, bool autoGrowth) { _autoGrowth = autoGrowth; bufferStack = new ThreadSafePool<SafeBuffer>(count); for (int i = 0; i < count; i++) { byte[] buf = new byte[blocksize]; bufferStack.Push(new SafeBuffer(buf)); } }