Ejemplo n.º 1
0
            /// <summary>
            /// Извлечение объекта аргументов для асинхронного сокета из стека
            /// </summary>
            /// <returns></returns>
            public TcpSocketAsyncEventArgs Pop()
            {
                TcpSocketAsyncEventArgs result = null;

                //We are locking the stack, but we could probably use a ConcurrentStack if
                // we wanted to be fancy
                lock (syncObject)
                {
                    if (stackSocketAsyncEventArgs.Count > 0)
                    {
                        result = stackSocketAsyncEventArgs.Pop();
                        result.Clear();
                        Interlocked.Increment(ref countEventsLock);
                    }
                    if (newSocketAsyncEventArgs != null)
                    {
                        result = newSocketAsyncEventArgs();
                        Interlocked.Increment(ref countEventsLock);
                    }
#if DEBUG
                    if (isLogging)
                    {
                        WriteToLog("PoolSocketAsyncEventArgs.Pop(): CountLock = " + CountEventsLock);
                    }
#endif
                }
                if (result != null)
                {
                    result.AcceptSocket   = null;
                    result.SocketError    = SocketError.Success;
                    result.RemoteEndPoint = null;
                    result.UserToken      = null;
                }
                return(result);
            }
Ejemplo n.º 2
0
        /// <summary>
        /// Обработка события чтения данных из сокета
        /// </summary>
        /// <param name="e">Параметр с текущим состоянием сокета</param>
        protected virtual void ProcessReceive(TcpSocketAsyncEventArgs e)
        {
            // Если количество переданных байтов 0 или принимающий сокет удален, то закроем соединение
            if (e.BytesTransferred == 0 || socket == null)
            {
                if (isLogging)
                {
                    WriteToLog(string.Concat("ProcessReceive -> e.BytesTransferred == 0 || socket == null"));
                }
                CloseConnection(e);
                return;
            }

            e.Read();

#if DEBUG
            if (isLogging)
            {
                WriteToLog(string.Concat("ProcessReceive Num=", e.Num, ", Available=", e.Socket.Available, ", BytesTransferred=", e.BytesTransferred, ", Offset=", e.Offset, ", Count=", e.Count));
            }
#endif

            // Прочитаны все данные, можем их теперь обработать
            if (e.Socket.Available == 0)
            {
                if (isLogging)
                {
                    WriteToLog(string.Concat("ProcessReceive END:  Num=", e.Num, ", Available=", e.Socket.Available, ", BytesTransferred=", e.BytesTransferred, ", Offset=", e.Offset, ", Count=", e.Count));
                }
                //e.IsClear = true;
                OnReceiveHandle(e);
                //if (e.IsClear)
                e.Clear();
            }
            // и продолжаем читать дальше
            if (!e.IsClosed)
            {
                if (!e.Socket.ReceiveAsync(e))
                {
                    ProcessReceive(e);
                }
            }
        }