protected void InitInbound(IConnection connection, INode remoteSocketAddress, NetworkData msg) { _associationListenerTask.ContinueWith(r => { var listener = r.Result; var remoteAddress = HeliosTransport.NodeToAddress(remoteSocketAddress, WrappedTransport.SchemeIdentifier, WrappedTransport.System.Name); if (remoteAddress == null) { throw new HeliosNodeException("Unknown inbound remote address type {0}", remoteSocketAddress); } AssociationHandle handle; Init(connection, remoteSocketAddress, remoteAddress, msg, out handle); listener.Notify(new InboundAssociation(handle)); }, TaskContinuationOptions.ExecuteSynchronously | TaskContinuationOptions.NotOnCanceled | TaskContinuationOptions.NotOnFaulted); }
protected void Init(IConnection channel, INode remoteSocketAddress, Address remoteAddress, NetworkData msg, out AssociationHandle op) { var localAddress = HeliosTransport.NodeToAddress(channel.Local, WrappedTransport.SchemeIdentifier, WrappedTransport.System.Name, WrappedTransport.Settings.Hostname); if (localAddress != null) { var handle = CreateHandle(channel, localAddress, remoteAddress); handle.ReadHandlerSource.Task.ContinueWith(s => { var listener = s.Result; RegisterListener(channel, listener, msg, remoteSocketAddress); }, TaskContinuationOptions.AttachedToParent & TaskContinuationOptions.ExecuteSynchronously & TaskContinuationOptions.NotOnCanceled & TaskContinuationOptions.NotOnFaulted); op = handle; } else { op = null; channel.Close(); } }