protected virtual void OnDataReceived(object sender, ActorTransportDataReceivedEventArgs e) { _keepAliveTracker.OnDataReceived(); ActorFrameHeader actorKeepAliveRequestFrameHeader = null; bool isHeaderDecoded = _channelConfiguration.FrameBuilder.TryDecodeFrameHeader( e.Data, e.DataOffset, e.DataLength, out actorKeepAliveRequestFrameHeader); if (isHeaderDecoded && actorKeepAliveRequestFrameHeader.OpCode == OpCode.Ping) { _log.DebugFormat("KeepAlive receive request from remote actor [{0}] to local actor [{1}].", _remoteActor, _localActor); var actorKeepAliveResponse = new PongFrame(); var actorKeepAliveResponseBuffer = _channelConfiguration.FrameBuilder.EncodeFrame(actorKeepAliveResponse); _log.DebugFormat("KeepAlive send response from local actor [{0}] to remote actor [{1}].", _localActor, _remoteActor); _connector.BeginSend(actorKeepAliveResponseBuffer); } else if (isHeaderDecoded && actorKeepAliveRequestFrameHeader.OpCode == OpCode.Pong) { _log.DebugFormat("KeepAlive receive response from remote actor [{0}] to local actor [{1}].", _remoteActor, _localActor); StopKeepAliveTimeoutTimer(); } else { if (DataReceived != null) { DataReceived(this, new ActorDataReceivedEventArgs(this.ConnectToEndPoint.ToString(), _remoteActor, e.Data, e.DataOffset, e.DataLength)); } } }
private void Handshake(TimeSpan timeout) { var actorHandshakeRequestData = _channelConfiguration.FrameBuilder.ControlFrameDataEncoder.EncodeFrameData(_localActor); var actorHandshakeRequest = new HelloFrame(actorHandshakeRequestData); var actorHandshakeRequestBuffer = _channelConfiguration.FrameBuilder.EncodeFrame(actorHandshakeRequest); ManualResetEventSlim waitingHandshaked = new ManualResetEventSlim(false); ActorTransportDataReceivedEventArgs handshakeResponseEvent = null; EventHandler <ActorTransportDataReceivedEventArgs> onHandshaked = (s, e) => { handshakeResponseEvent = e; waitingHandshaked.Set(); }; _connector.DataReceived += onHandshaked; _log.DebugFormat("Handshake request from local actor [{0}].", _localActor); _connector.BeginSend(actorHandshakeRequestBuffer); bool handshaked = waitingHandshaked.Wait(timeout); _connector.DataReceived -= onHandshaked; waitingHandshaked.Dispose(); if (handshaked && handshakeResponseEvent != null) { ActorFrameHeader actorHandshakeResponseFrameHeader = null; bool isHeaderDecoded = _channelConfiguration.FrameBuilder.TryDecodeFrameHeader( handshakeResponseEvent.Data, handshakeResponseEvent.DataOffset, handshakeResponseEvent.DataLength, out actorHandshakeResponseFrameHeader); if (isHeaderDecoded && actorHandshakeResponseFrameHeader.OpCode == OpCode.Welcome) { byte[] payload; int payloadOffset; int payloadCount; _channelConfiguration.FrameBuilder.DecodePayload( handshakeResponseEvent.Data, handshakeResponseEvent.DataOffset, actorHandshakeResponseFrameHeader, out payload, out payloadOffset, out payloadCount); var actorHandshakeResponseData = _channelConfiguration.FrameBuilder.ControlFrameDataDecoder.DecodeFrameData <ActorIdentity>( payload, payloadOffset, payloadCount); _remoteActor = actorHandshakeResponseData; _log.DebugFormat("Handshake response from remote actor [{0}].", _remoteActor); } if (_remoteActor == null) { _log.ErrorFormat("Handshake with remote [{0}] failed, invalid actor description.", this.ConnectToEndPoint); Close(); } else { _log.DebugFormat("Handshake with remote [{0}] successfully, RemoteActor[{1}].", this.ConnectToEndPoint, _remoteActor); IsHandshaked = true; if (Connected != null) { Connected(this, new ActorConnectedEventArgs(this.ConnectToEndPoint.ToString(), _remoteActor)); } _connector.DataReceived += OnDataReceived; _keepAliveTracker.StartTimer(); } } else { _log.ErrorFormat("Handshake with remote [{0}] timeout [{1}].", this.ConnectToEndPoint, timeout); Close(); } }