Exemple #1
0
 protected AsyncSocketSession(SessionType sessionType,
                              IPEndPoint remoteEndPoint, bool reuseSocket)
     : base(sessionType, remoteEndPoint)
 {
     _socket      = SocketFactory.CreateSocket(sessionType);
     _reuseSocket = reuseSocket;
     _sendSaea    = SocketAsyncEventArgsPoolManager.Instance.SendSaeaPool.Take();
     _receiveSaea = SocketAsyncEventArgsPoolManager.Instance.ReceiveSaeaPool.Take();
     (_sendSaea.UserToken as AsyncSocketSessionToken).Session    = this;
     (_receiveSaea.UserToken as AsyncSocketSessionToken).Session = this;
 }
 public override void Start()
 {
     try
     {
         base.Started    = true;
         _listenerSocket = SocketFactory.CreateSocket(base.SessionType);
         SetSocketOptions();
         _listenerSocket.Bind(base.ListenEndPoint);
         _listenerSocket.Listen(base.Backlog);
         DoAcceptAsync();
     }
     catch (Exception ex)
     {
         CaughtException(ex);
         throw new Exception("Async socket session acceptor start failed.", ex);
     }
 }
        void DoAcceptAsync()
        {
            Socket acceptSocket = null;

            lock (_reuseSocketQueue)
            {
                if (_reuseSocketQueue.Count > 0)
                {
                    acceptSocket = _reuseSocketQueue.Dequeue();
                }
            }

            if (acceptSocket == null)
            {
                acceptSocket = SocketFactory.CreateSocket(base.SessionType);
            }

            SocketAsyncEventArgs args = _acceptSaea;

            args.AcceptSocket = acceptSocket;
            args.UserToken    = this;
            bool isAsync = true;

            try
            {
                isAsync = _listenerSocket.AcceptAsync(args);
            }
            catch (Exception ex)
            {
                args.AcceptSocket = null;
                CaughtException(ex);
            }

            if (!isAsync)
            {
                ProcessAccept(args);
            }

            lock (_pendingSockets)
            {
                _pendingSockets.AddLast(acceptSocket);
            }
        }