예제 #1
0
        protected virtual Task <AssociationHandle> CreateOutboundAssociation(Stream stream, Address localAddress, Address remoteAddress, Socket socket)
        {
            var association = new StreamAssociationHandle(Settings, stream, localAddress, remoteAddress, socket);

            RegisterAssociation(association);

            association.ReadHandlerSource.Task.ContinueWith(task => association.Initialize(task.Result),
                                                            CancellationToken.None,
                                                            TaskContinuationOptions.ExecuteSynchronously | TaskContinuationOptions.OnlyOnRanToCompletion,
                                                            TaskScheduler.Default);

            return(Task.FromResult((AssociationHandle)association));
        }
예제 #2
0
        public AssociationHandle CreateInboundAssociation(NamedPipeServerStream stream, Address remoteAddress)
        {
            //TODO Add unique id in InboundAddress?
            var association = new StreamAssociationHandle(Settings, stream, InboundAddress, remoteAddress, null);

            RegisterAssociation(association);

            association.ReadHandlerSource.Task.ContinueWith(task => association.Initialize(task.Result),
                                                            CancellationToken.None,
                                                            TaskContinuationOptions.ExecuteSynchronously | TaskContinuationOptions.OnlyOnRanToCompletion,
                                                            TaskScheduler.Default);

            return(association);
        }
예제 #3
0
        public void RegisterAssociation(StreamAssociationHandle association)
        {
            lock (_associations)
            {
                _associations.Add(association);
            }

            association.Stopped.ContinueWith(_ =>
            {
                lock (_associations)
                {
                    _associations.Remove(association);
                }
            }, ShutdownToken);
        }
예제 #4
0
        public AssociationHandle CreateOutboundAssociation(Address remoteAddress)
        {
            NamedPipeClientStream stream = new NamedPipeClientStream(".", remoteAddress.Host, PipeDirection.InOut, PipeOptions.Asynchronous);

            // Should not block, the server listens for `MaxAllowedServerInstances`
            // Connect will throw if the server is not listening
            stream.Connect();

            string uniqueId     = Guid.NewGuid().ToString("N");
            var    localAddress = new Address(ProtocolName, System.Name, Settings.PipeName + "_" + uniqueId, 1);

            var association = new StreamAssociationHandle(Settings, stream, localAddress, remoteAddress.WithPort(1), null);

            RegisterAssociation(association);

            association.ReadHandlerSource.Task.ContinueWith(task => association.Initialize(task.Result),
                                                            CancellationToken.None,
                                                            TaskContinuationOptions.ExecuteSynchronously | TaskContinuationOptions.OnlyOnRanToCompletion,
                                                            TaskScheduler.Default);

            return(association);
        }