示例#1
0
        public void OnIOCompleted(object sender, SocketAsyncEventArgs e)
        {
            TCPSocketToken token = e.UserToken as TCPSocketToken;

            try
            {
                if (e.LastOperation == SocketAsyncOperation.Send)
                {
                    token.OnSendCompleted();
                }
                else if (e.LastOperation == SocketAsyncOperation.Receive && e.BytesTransferred > 0)
                {
                    token.OnReciveCompleted();
                    token.DoRecive();
                }
                else
                {
                    if (sender as Socket == token.ConnectSocket)
                    {
                        CloseToken(token);
                    }
                }
            }
            catch (Exception ex)
            {
                LogHelper.LogException(ex);
                if (sender as Socket == token.ConnectSocket)
                {
                    CloseToken(token);
                }
            }
        }
示例#2
0
 public void SetToken(TCPSocketToken token)
 {
     Interlocked.Exchange(ref _Token, token);
     if (token != null)
     {
         token.Session = this;
         token.SetPacketList(_SendList);
     }
 }
示例#3
0
 public override void Stop()
 {
     TCPSocketToken[] tokens = new TCPSocketToken[Tokens.Count];
     lock (Tokens)
     {
         Tokens.CopyTo(tokens);
     }
     foreach (var token in tokens)
     {
         token.DisConnect();
     }
 }
示例#4
0
        public virtual bool SendPacket(INetPacket packt)
        {
            _SendList.Enqueue(packt);
            TCPSocketToken token = Token;

            if (token == null || !token.IsConnect)
            {
                return(false);
            }
            token.TrySend();
            return(true);
        }
示例#5
0
 public void Push(TCPSocketToken token)
 {
     lock (this)
     {
         if (token != null && !_TokenPool.Contains(token))
         {
             --_UsedTokenNum;
             token.Clear();
             token.Session = null;
             _TokenPool.Enqueue(token);
         }
     }
 }
示例#6
0
        public bool SendPackets(IEnumerable <INetPacket> packets)
        {
            foreach (var pack in packets)
            {
                _SendList.Enqueue(pack);
            }
            TCPSocketToken token = Token;

            if (token == null || !token.IsConnect)
            {
                return(false);
            }
            token.TrySend();
            return(true);
        }
示例#7
0
 public void CloseToken(TCPSocketToken token)
 {
     lock (CloseLockObj)
     {
         if (OnCloseToken != null)
         {
             OnCloseToken(this, token);
         }
         TCPSession session = token.Session;
         if (session != null)
         {
             session.SetToken(null);
             session.OnDisconnect();
         }
         _TokenPool.Push(token);
     }
 }
示例#8
0
 public TCPSocketToken Pop()
 {
     lock (this)
     {
         TCPSocketToken token = null;
         if (_TokenPool.Count > 0)
         {
             token = _TokenPool.Dequeue();
         }
         if (token == null)
         {
             token = CreatNewToken();
         }
         ++_UsedTokenNum;
         token.Clear();
         return(token);
     }
 }
示例#9
0
        public bool IsConnect()
        {
            TCPSocketToken token = Token;

            return(token != null && token.IsConnect);
        }