/// <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(); } }
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); } }