Esempio n. 1
0
        public virtual void Initialize(IAppSession appSession)
        {
            AppSession = appSession;
            Config     = appSession.Config;
            SyncSend   = Config.SyncSend;

            if (m_SendingQueuePool == null)
            {
                m_SendingQueuePool = ((SocketServerBase)((ISocketServerAccessor)appSession.AppServer).SocketServer).SendingQueuePool;
            }

            SendingQueue queue;

            if (m_SendingQueuePool.TryGet(out queue))
            {
                m_SendingQueue = queue;
                queue.StartEnqueue();
            }

            if (Config.CollectSendIntervalMillSec > 0)
            {
                CollectSendBuffer = new ReuseLockBaseBuffer(Config.ReceiveBufferSize);
                SyncSend          = true;
            }
        }
        public void Initialize(IAppSession appSession)
        {
            this.AppSession = appSession as AppSession;

            SendingQueue queue;

            if (m_SendingQueuePool.TryGet(out queue))
            {
                m_SendingQueue = queue;
                queue.StartEnqueue();
            }

            SocketAsyncProxy.Initialize(this);

            //Initialize SocketAsyncEventArgs for sending
            m_SocketEventArgSend            = new SocketAsyncEventArgs();
            m_SocketEventArgSend.Completed += new EventHandler <SocketAsyncEventArgs>(OnSendingCompleted);
        }
Esempio n. 3
0
        public virtual void Initialize(IAppSession appSession)
        {
            AppSession = appSession;
            Config     = appSession.Config;
            SyncSend   = Config.SyncSend;

            if (m_SendingQueuePool == null)
            {
                m_SendingQueuePool = ((SocketServerBase)((ISocketServerAccessor)appSession.AppServer).SocketServer).SendingQueuePool;
            }

            SendingQueue queue;

            if (m_SendingQueuePool.TryGet(out queue))
            {
                m_SendingQueue = queue;
                queue.StartEnqueue();
            }
        }
Esempio n. 4
0
        private void StartSend(SendingQueue queue, int sendingTrackID, bool initial)
        {
            if (initial)
            {
                if (!TryAddStateFlag(SocketState.InSending))
                {
                    return;
                }

                var currentQueue = m_SendingQueue;

                if (currentQueue != queue || sendingTrackID != currentQueue.TrackID)
                {
                    //Has been sent
                    OnSendEnd();
                    return;
                }
            }

            Socket client;

            if (IsInClosingOrClosed && TryValidateClosedBySocket(out client))
            {
                OnSendEnd(true);
                return;
            }

            SendingQueue newQueue;

            if (!m_SendingQueuePool.TryGet(out newQueue))
            {
                AppSession.Logger.Error("There is no enougth sending queue can be used.");
                OnSendEnd(false);
                this.Close(CloseReason.InternalError);
                return;
            }

            var oldQueue = Interlocked.CompareExchange(ref m_SendingQueue, newQueue, queue);

            if (!ReferenceEquals(oldQueue, queue))
            {
                if (newQueue != null)
                {
                    m_SendingQueuePool.Push(newQueue);
                }

                if (IsInClosingOrClosed)
                {
                    OnSendEnd(true);
                }
                else
                {
                    OnSendEnd(false);
                    AppSession.Logger.Error("Failed to switch the sending queue.");
                    this.Close(CloseReason.InternalError);
                }

                return;
            }

            //Start to allow enqueue
            newQueue.StartEnqueue();
            queue.StopEnqueue();

            if (queue.Count == 0)
            {
                AppSession.Logger.Error("There is no data to be sent in the queue.");
                m_SendingQueuePool.Push(queue);
                OnSendEnd(false);
                this.Close(CloseReason.InternalError);
                return;
            }

            Send(queue);
        }
Esempio n. 5
0
        public virtual void Initialize(IAppSession appSession)
        {
            AppSession = appSession;
            Config = appSession.Config;
            SyncSend = Config.SyncSend;
            m_SendingQueuePool = ((SocketServerBase)((ISocketServerAccessor)appSession.AppServer).SocketServer).SendingQueuePool;

            SendingQueue queue;
            if (m_SendingQueuePool.TryGet(out queue))
            {
                m_SendingQueue = queue;
                queue.StartEnqueue();
            }
        }