public override void SendAsync(byte[] data, int offset, int lenght) { if (this.Socket == null) { return; } byte[] buffer = this._isCompress ? this.BuilderPack(GZipHelper.Compress(data, offset, lenght)) : this.BuilderPack(data, offset, lenght); var awaiter = HandlerSaeaPool.Take(); awaiter.Saea.SetBuffer(buffer, 0, buffer.Length); Interlocked.Increment(ref _intervalIsUseChannel); SaeaExHelper.SendAsync(this.Socket, awaiter, (a, e) => { Interlocked.Decrement(ref _intervalIsUseChannel); this.HandlerSaeaPool.Return(awaiter); this.SendTransferredBytes = a.Saea.Buffer.Length; this.NotifyEventHandler?.Invoke(TcpSocketCompletionNotify.OnSend, this); }); }
public override void SendAsync(byte[] data, int offset, int length) { if (this._socket == null) { return; } byte[] buffer = this._iscompress ? this.BuilderPack(CompressHelper.Compress(data, offset, length)) : this.BuilderPack(data, offset, length); var awaiter = _handlerSaeaPool.Take(); awaiter.Saea.SetBuffer(buffer, 0, buffer.Length); Interlocked.Increment(ref _isuchannel); SaeaExHelper.SendAsync(this._socket, awaiter, (a, e) => { Interlocked.Decrement(ref _isuchannel); this._handlerSaeaPool.Return(awaiter); this.SendTransferredBytes = a.Saea.Buffer.Length; this._notifyEventHandler?.Invoke(TcpSocketCompletionNotify.OnSend, this); if (e != SocketError.Success) { _logger.WriteLog(string.Format("SendAsync--exception:{0}", e.ToString())); } }); }
private void HeadProcess(SaeaAwaiter awaiter, SocketError error) { if (awaiter.Saea.BytesTransferred == 0 || error != SocketError.Success || State != TcpSocketConnectionState.Connected || Socket == null) { LogHelper.WriteLog("session_recv endtransfer state:" + State.ToString() + " socket_error:" + error.ToString()); this.EndTransfer(awaiter); return; } _heartTime = DateTime.Now; _packageRecvOffset += awaiter.Saea.BytesTransferred; if (_packageRecvOffset >= 4) { int packBytesTransferred = BitConverter.ToInt32(_headBuffer, 0); if (packBytesTransferred < 0 || packBytesTransferred > Configuration.SendBufferSize)//长度包越界判断 { this.Close(true); return; } if (packBytesTransferred == 0) { if (this.Configuration._intervalWhetherService) //如果是服务端,则反馈心跳包 { if (this._intervalIsUseChannel == 0) { var h_saea = HandlerSaeaPool.Take(); //4个字节空包头 h_saea.Saea.SetBuffer(_emptyHeart, 0, _emptyHeart.Length); SaeaExHelper.SendAsync(this.Socket, h_saea, (a, e) => HandlerSaeaPool.Return(a)); } } //继续接收包头 _packageRecvOffset = 0; awaiter.Saea.SetBuffer(_packageRecvOffset, _headBuffer.Length); SaeaExHelper.ReceiveAsync(this.Socket, awaiter, HeadProcess); return; } CompletedBuffer = new byte[packBytesTransferred]; _packageRecvOffset = 0; awaiter.Saea.SetBuffer(CompletedBuffer, _packageRecvOffset, CompletedBuffer.Length); SaeaExHelper.ReceiveAsync(this.Socket, awaiter, PacketPartProcess); } else { awaiter.Saea.SetBuffer(_packageRecvOffset, _headBuffer.Length - _packageRecvOffset); SaeaExHelper.ReceiveAsync(this.Socket, awaiter, HeadProcess); } }
private void AppKeepAliveWorkThread() { byte[] emptyHeart = new byte[] { 0, 0, 0, 0 }; while (this._isruning) { for (int i = 0; i < _tcpSocketSaeaSessions.Count; i++) { var session = (TcpSocketSaeaPackBased)_tcpSocketSaeaSessions[i]; if (session.State == TcpSocketConnectionState.Closed || session.State == TcpSocketConnectionState.None) { _logger.WriteLog("client_heart_thread = Closed || None"); _tcpSocketSaeaSessions.RemoveAt(i); i--; continue; } if (session.State == TcpSocketConnectionState.Connecting) { continue; } if ((int)(DateTime.Now - session._heartTime).TotalSeconds > 20) { _logger.WriteLog("client_heart_thread_timeout ! state:" + session.State.ToString() + " present_time:" + DateTime.Now.ToString() + " heart_time:" + session._heartTime.ToString()); if (session.State == TcpSocketConnectionState.Connected) { session.Close(true); _tcpSocketSaeaSessions.RemoveAt(i); i--; } } else { //如果数据正在发送,就不发送心跳 if (session._isuchannel == 0) { var awaiter = _handlerSaeaPool.Take(); //4个字节空包头 awaiter.Saea.SetBuffer(emptyHeart, 0, emptyHeart.Length); SaeaExHelper.SendAsync(session.Socket, awaiter, (a, e) => _handlerSaeaPool.Return(a)); } } } Thread.Sleep(5000); } }
public override void SendAsync(byte[] data, int offset, int lenght) { if (this.Socket == null) { return; } var awaiter = HandlerSaeaPool.Take(); awaiter.Saea.SetBuffer(data, offset, lenght); SaeaExHelper.SendAsync(this.Socket, awaiter, (a, e) => { this.SendTransferredBytes = a.Saea.Buffer.Length; HandlerSaeaPool.Return(awaiter); this.NotifyEventHandler?.Invoke(TcpSessionNotify.OnSend, this); }); }