Exemplo n.º 1
0
        /// <summary>
        /// 接受到连入处理
        /// </summary>
        /// <param name="_socketAsyncEventArgs">异步Socket对象</param>
        private void EndAccept(SocketAsyncEventArgs _socketAsyncEventArgs)
        {
            SocketSession _socketSession = (SocketSession)_socketAsyncEventArgs.UserToken;

            if (_socketAsyncEventArgs.SocketError != SocketError.Success || !this.OnSocketAccept(_socketAsyncEventArgs.AcceptSocket))
            {
                _socketSession.Clear();
                this.BeginAccept();
                return;
            }
            if (!this.bufferManager.SetBuffer(_socketAsyncEventArgs))
            {
                throw new OverflowException("Out of buffer.");
            }

            try
            {
                if (this.keepAliveIO)
                {
                    _socketAsyncEventArgs.AcceptSocket.IOControl(IOControlCode.KeepAliveValues, this.keepAliveByteArray, null);
                }

                DateTime _now = DateTime.UtcNow;
                _socketSession.LastOperationTime = _now;
                _socketSession.Id     = _now.ToString("yyyyMMddHHmmss") + _socketSession.Index.ToString("00000000");
                _socketSession.Status = SocketSessionStatus.Connected;

                this.OnSessionStart(_socketSession);
                this.BeginReceive(_socketAsyncEventArgs);
            }
            catch (Exception)
            {
                this.bufferManager.FreeBuffer(_socketAsyncEventArgs);
                _socketSession.Clear();
            }
            finally
            {
                this.BeginAccept();
            }
        }
Exemplo n.º 2
0
        internal void EndReceive(SocketAsyncEventArgs _socketAsyncEventArgs)
        {
            try
            {
                bool _disconnect = false;
                if (_socketAsyncEventArgs == null || _socketAsyncEventArgs.SocketError != SocketError.Success || _socketAsyncEventArgs.BytesTransferred <= 0 || _shutingdown)
                {
                    _disconnect = true;
                }

                SocketSession _socketSession = (SocketSession)_socketAsyncEventArgs.UserToken;
                if (!_disconnect)
                {
                    try
                    {
                        #region 读取数据
                        _socketSession.ReceivedStream.Write(_socketAsyncEventArgs.Buffer, _socketAsyncEventArgs.Offset, _socketAsyncEventArgs.BytesTransferred);
                        byte[] _receivedBytes = _socketSession.ReceivedStream.ToArray();
                        if (_receivedBytes == null)
                        {
                            _disconnect = true;
                        }
                        try
                        {
                            this.OnReceive(_socketSession, _receivedBytes);
                        }
                        catch (Exception _ex)
                        {
                            this.OnException(_ex);
                            _disconnect = true;
                        }
                        _socketSession.LastOperationTime = DateTime.UtcNow;
                        #endregion

                        #region 匹配协议
                        if (_socketSession.Protocol == null)
                        {
                            for (int i = 0; i < this.Protocols.Length; i++)
                            {
                                if (this.Protocols[i].Check(_receivedBytes, false, _socketSession))
                                {
                                    _socketSession.Protocol = this.Protocols[i];
                                    break;
                                }
                            }
                        }
                        #endregion

                        #region 处理数据包
                        if (_socketSession.Protocol != null)
                        {
                            while (_receivedBytes != null && _socketSession.Protocol.Check(_receivedBytes, false, _socketSession))
                            {
                                uint   _packageSize = 0;
                                object _package     = _socketSession.Protocol.DePackage(_receivedBytes, out _packageSize, false, _socketSession);
                                if (_package == null)
                                {
                                    throw new Exception("Package is NULL.");
                                }

                                #region OnReceivingPackage 事件处理
                                try
                                {
                                    this.OnReceivingPackage(_socketSession, _package);
                                }
                                catch (Exception _ex)
                                {
                                    this.OnException(_ex);
                                }
                                #endregion

                                if (!_socketSession.Protocol.Check(_receivedBytes, true, _socketSession))
                                {
                                    break;
                                }

                                _packageSize = 0;
                                _package     = _socketSession.Protocol.DePackage(_receivedBytes, out _packageSize, true, _socketSession);
                                if (_package == null)
                                {
                                    throw new Exception("Package is NULL.");
                                }

                                #region 刷新已接受数据流
                                byte[] _temp = new byte[_socketSession.ReceivedStream.Length - _packageSize];
                                if (_temp.Length > 0)
                                {
                                    _socketSession.ReceivedStream.Position = _packageSize;
                                    _socketSession.ReceivedStream.Read(_temp, 0, _temp.Length);
                                    _socketSession.ReceivedStream.Position = 0;
                                    _socketSession.ReceivedStream.Write(_temp, 0, _temp.Length);
                                    _socketSession.ReceivedStream.SetLength(_temp.Length);
                                    _socketSession.ReceivedStream.Capacity = _temp.Length;
                                    _receivedBytes = _socketSession.ReceivedStream.ToArray();
                                }
                                else
                                {
                                    _socketSession.ReceivedStream.SetLength(0);
                                    _socketSession.ReceivedStream.Capacity = 0;
                                    _receivedBytes = new byte[0];
                                }
                                #endregion

                                #region OnReceivedPackage 事件处理
                                try
                                {
                                    if (_socketSession.Protocol.IsKeepAlivePackage(_package, _socketSession))
                                    {
                                        _socketSession.SendPackage(_socketSession.Protocol.KeepAlivePackage);
                                    }
                                    else
                                    {
                                        this.OnReceivedPackage(_socketSession, _package);
                                    }
                                }
                                catch (Exception _ex)
                                {
                                    this.OnException(_ex);
                                }
                                #endregion
                            }
                        }
                        #endregion

                        this.BeginReceive(_socketAsyncEventArgs);
                        return;
                    }
                    catch (Exception _ex)
                    {
                        Console.WriteLine(_ex);
                        _disconnect = true;
                    }
                }

                if (_disconnect)
                {
                    this.BeginDisconnect(_socketAsyncEventArgs.AcceptSocket);
                    this.OnSessionEnd(_socketSession);
                    this.bufferManager.FreeBuffer(_socketAsyncEventArgs);
                    _socketSession.Clear();
                }
            }
            catch (Exception _ex)
            {
                this.OnException(_ex);
            }
        }