private void Handshake(byte[] data, int dataOffset, int dataLength) { ActorFrameHeader actorHandshakeRequestFrameHeader = null; bool isHeaderDecoded = _channelConfiguration.FrameBuilder.TryDecodeFrameHeader( data, dataOffset, dataLength, out actorHandshakeRequestFrameHeader); if (isHeaderDecoded && actorHandshakeRequestFrameHeader.OpCode == OpCode.Hello) { byte[] payload; int payloadOffset; int payloadCount; _channelConfiguration.FrameBuilder.DecodePayload( data, dataOffset, actorHandshakeRequestFrameHeader, out payload, out payloadOffset, out payloadCount); var actorHandshakeRequestData = _channelConfiguration .FrameBuilder .ControlFrameDataDecoder .DecodeFrameData <ActorIdentity>(payload, payloadOffset, payloadCount); _remoteActor = actorHandshakeRequestData; } if (_remoteActor == null) { _log.ErrorFormat("Handshake with remote [{0}] failed, invalid actor description.", this.SessionKey); Close(); } else { var actorHandshakeResponseData = _channelConfiguration.FrameBuilder.ControlFrameDataEncoder.EncodeFrameData(_localActor); var actorHandshakeResponse = new WelcomeFrame(actorHandshakeResponseData); var actorHandshakeResponseBuffer = _channelConfiguration.FrameBuilder.EncodeFrame(actorHandshakeResponse); _innerSession.Send(actorHandshakeResponseBuffer); IsHandshaked = true; _log.DebugFormat("Handshake with remote [{0}] successfully, SessionKey[{1}].", _remoteActor, this.SessionKey); if (SessionHandshaked != null) { SessionHandshaked(this, new ActorChannelSessionHandshakedEventArgs(this, _remoteActor)); } _keepAliveTracker.StartTimer(); } }
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(); } }