Beispiel #1
0
        /// <summary>
        /// Wait on connection and received messages
        /// </summary>
        protected virtual void ReceiveAction()
        {
            try
            {
                using (NamedPipeServerStream serverStream =
                           new NamedPipeServerStream(
                               PipeName,
                               PipeDirection.InOut,
                               NumberOfThreads,
                               PipeTransmissionMode.Byte,
                               PipeOptions.Asynchronous))
                {
                    Task t = serverStream.WaitForConnectionAsync(CancellationToken.Token);
                    t.GetAwaiter().GetResult();


                    Guid      id     = Guid.NewGuid();
                    IpcStream stream = new IpcStream(serverStream, KnownTypes);

                    while (ProcessMessage(stream, id))
                    {
                    }
                    StatefulProxy.NotifyDisconnect(id);
                }

                // Todo: make sure there's a new listener, even when this isn't reached
                serverTask.Add(Task.Factory.StartNew(ReceiveAction));
            }
            catch (OperationCanceledException) { }
        }
Beispiel #2
0
        /// <summary>
        /// Main connection loop, waits for and handles connections
        /// </summary>
        protected override void ReceiveAction()
        {
            try
            {
                var t = listener.AcceptTcpClientAsync(CancellationToken.Token);

                // wait for connection
                using (System.Net.Sockets.TcpClient client = t.GetAwaiter().GetResult())
                {
                    // Start new connection waiter before anything can go wrong here,
                    // leaving us without a server
                    serverTask.Add(Task.Factory.StartNew(ReceiveAction));

                    using (NetworkStream networkStream = client.GetStream())
                    {
                        networkStream.ReadTimeout = Server.ReadTimeOut;
                        Stream serverStream = networkStream;

                        Guid      id     = Guid.NewGuid();
                        IpcStream stream = new IpcStream(serverStream, KnownTypes, Encryptor);

                        // process incoming messages until disconnect
                        while (ProcessMessage(stream, id))
                        {
                        }
                        StatefulProxy.NotifyDisconnect(id);

                        serverStream.Close();
                    }
                }
            }
            catch (OperationCanceledException) { }
        }