BF2Statistics.Net.BufferManager.AssignBuffer C# (CSharp) Method

AssignBuffer() public method

Assigns a buffer space from the buffer block to the specified SocketAsyncEventArgs object.
public AssignBuffer ( SocketAsyncEventArgs args ) : bool
args System.Net.Sockets.SocketAsyncEventArgs The SocketEventArgs object to assign a buffer space to
return bool
        public bool AssignBuffer(SocketAsyncEventArgs args)
        {
            // Check for dispose
            CheckDisposed();

            // Make sure we have enough room in the buffer!
            if (!SpaceAvailable) return false;

            // Set the user token property to our BufferDataToken
            BufferDataToken Token;
            if (FreeBufferSpace.TryPop(out Token))
            {
                args.SetBuffer(Buffer, Token.BufferOffset, Token.BufferBlockSize);
                args.UserToken = Token;
                return true;
            }

            return false;
        }

Usage Example

        /// <summary>
        /// Creates a new TCP socket for handling Gamespy Protocol
        /// </summary>
        /// <param name="Port">The port this socket will be bound to</param>
        /// <param name="MaxConnections">The maximum number of concurrent connections</param>
        public GamespyTcpSocket(int Port, int MaxConnections)
        {
            // Create our Socket
            Listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            // Set Socket options
            Listener.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontLinger, true);
            Listener.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Linger, false);
            Listener.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);

            // Bind to our port
            Listener.Bind(new IPEndPoint(IPAddress.Any, Port));
            Listener.Listen(25);

            // Set the rest of our internals
            MaxNumConnections = MaxConnections;
            MaxConnectionsEnforcer = new SemaphoreSlim(MaxNumConnections, MaxNumConnections);
            SocketAcceptPool = new SocketAsyncEventArgsPool(ConcurrentAcceptPoolSize);
            SocketReadWritePool = new SocketAsyncEventArgsPool(MaxNumConnections);

            // Create our Buffer Manager for IO operations. 
            // Always allocate double space, one for recieving, and another for sending
            BufferManager = new BufferManager(MaxNumConnections * 2, BufferSizePerEventArg); 

            // Assign our Connection Accept SocketAsyncEventArgs object instances
            for (int i = 0; i < ConcurrentAcceptPoolSize; i++)
            {
                SocketAsyncEventArgs SockArg = new SocketAsyncEventArgs();
                SockArg.Completed += (s, e) => PrepareAccept(e);

                // Do NOT assign buffer space for Accept operations!               
                // AcceptAsync does not take require a parameter for buffer size.
                SocketAcceptPool.Push(SockArg);
            }

            // Assign our Connection IO SocketAsyncEventArgs object instances
            for (int i = 0; i < MaxNumConnections * 2; i++)
            {
                SocketAsyncEventArgs SockArg = new SocketAsyncEventArgs();
                BufferManager.AssignBuffer(SockArg);
                SocketReadWritePool.Push(SockArg);
            }

            // set public internals
            IsListening = true;
            IgnoreNewConnections = false;
            IsDisposed = false;
        }