internal void HandleAccept(SocketAsyncEventArgs AcceptArgs) { if (AcceptArgs.SocketError != SocketError.Success) { HandleBadAccept(AcceptArgs); return; } StartAccept(); SocketAsyncEventArgs ReceiveArgs; if (ReceivePool.TryPop(out ReceiveArgs)) { ReceiveArgs.UserToken = (T)Activator.CreateInstance(typeof(T)); ((T)ReceiveArgs.UserToken).Socket = AcceptArgs.AcceptSocket; ((T)ReceiveArgs.UserToken).ReceiveEventArgs = ReceiveArgs; AcceptArgs.AcceptSocket = null; AcceptPool.Push(AcceptArgs); if (ConnectionAccepted != null) { ConnectionAccepted.Invoke((T)ReceiveArgs.UserToken); } StartReceive(ReceiveArgs); } else { HandleAccept(AcceptArgs); } }
public void HandleAccept(SocketAsyncEventArgs AcceptArgs) { if (AcceptArgs.SocketError != SocketError.Success) { HandleBadAccept(AcceptArgs); return; } StartAccept(); SocketAsyncEventArgs ReceiveArgs; if (ReceivePool.TryPop(out ReceiveArgs)) { Console.WriteLine("Received New Connection!"); // Create Session ReceiveArgs.UserToken = new Session(); ((Session)ReceiveArgs.UserToken).Socket = AcceptArgs.AcceptSocket; ((Session)ReceiveArgs.UserToken).ReceiveEventArgs = ReceiveArgs; // Create User AcceptArgs.AcceptSocket = null; AcceptPool.Push(AcceptArgs); StartReceive(ReceiveArgs); } else { HandleAccept(AcceptArgs); } }
internal void StartAccept() { SocketAsyncEventArgs AcceptArgs; if (AcceptPool.TryPop(out AcceptArgs)) { PoolEnforcer.Wait(); bool Trigger = Socket.AcceptAsync(AcceptArgs); if (!Trigger) { HandleAccept(AcceptArgs); } } }
internal void ConstructPooling(int SupportedAmount) { this.AcceptPool = new TPool <SocketAsyncEventArgs>(SupportedAmount); this.ReceivePool = new TPool <SocketAsyncEventArgs>(SupportedAmount); this.SendPool = new TPool <SocketAsyncEventArgs>(SupportedAmount); this.PoolEnforcer = new SemaphoreSlim(SupportedAmount, SupportedAmount); this.BufferPool = new BufferPool(SupportedAmount); this.BufferPool.PushAllReceivers(this, this.ReceivePool.PushAndHandleAll()); this.BufferPool.PushAllSenders(this, this.SendPool.PushAndHandleAll()); foreach (SocketAsyncEventArgs AcceptArgs in AcceptPool.PushAndHandleAll()) { AcceptArgs.Completed += AcceptArgs_Completed; } StartAccept(); }
internal void HandleBadAccept(SocketAsyncEventArgs AcceptArgs) { AcceptArgs.AcceptSocket.Close(); AcceptPool.Push(AcceptArgs); }