Pipe管道--NamedPipe与AnonymousPipe

管道分为命名管道和匿名管道

1.    命名管道简介

"命名管道"或"命名管线"(Named Pipes)是一种简单的进程间通信(I P C)机制,Microsoft Windows NT,Windows 2000,Windows 95以及Windows 98均提供了对它的支持(但不包括Windows CE).命名管道可在同一台计算机的不同进程之间,或在跨越一个网络的不同计算机的不同进程之间,支持可靠的,单向或双向的数据通信.用命名管道来设计应用程序实际非常简单,并不需要事先深入掌握基层网络传送协议(如T C P / I P或I P X)的知识.这是由于命名管道利用了微软网络提供者(M S N P)重定向器,通过一个网络,在各进程间建立通信.这样一来,应用程序便不必关心网络协议的细节.之所以要用命名管道作为自己的网络通信方案,一项重要的原因是它们充分利用了Windows NT及Windows 2000内建的安全特性.

2.命名管道作用

这里有一个可采纳命令管道的例子.假定我们要开发一个数据管理系统,只允许一个指定的用户组进行操作.想像在自己的办公室中,有一部计算机,其中保存着公司的秘密.我们要求只有公司的管理人员,才能访问及处理这些秘密.假定在自己的工作站机器上,公司内的每名员工都可看到网络上的这台计算机.然而,我们并不希望普通员工取得对机密材料的访问权.在这种情况下,命名管道可发挥出很好的作用,因为我们可开发一个服务器应用程序,令其以来自客户机的请求为准,对公司的秘密进行安全操作.服务器可将客户访问限制在管理人员身上,用Windows NT或新版Windows 2000自带的安全机制,便可非常轻松地做到这一点.在此要记住的一个重点是,将命名管道作为一种网络编程方案使用时,它实际上建立一个简单的客户机/服务器数据通信体系,可在其中可靠地传输数据.

3. 命名管道优点

使用比较方便,并且不需要声明端口号之类的,在程序中不需要关心权限之类的。

4. 命名管道限制(我个人认为)

管道只能一对一链接通信。

5. 命名管道通讯的实现以及匿名管道的实现如下:

        #region Anonymouspipe

        static string txID = null;
        static string rxID = null;
        public static void AnonymousPipeServer()
        {
            string clientExe = @"F:\Person\Longteng\LongtengSln\ConsoleAppTestAnonymousPipe\bin\Debug\ConsoleAppTestAnonymousPipe.exe";
            HandleInheritability inherit = HandleInheritability.Inheritable;
            using (var tx = new AnonymousPipeServerStream(PipeDirection.Out, inherit))
            using (var rx = new AnonymousPipeServerStream(PipeDirection.In, inherit))
            {
                txID = tx.GetClientHandleAsString();
                rxID = rx.GetClientHandleAsString();
                var startInfo = new ProcessStartInfo(clientExe, txID + " " + rxID);
                startInfo.UseShellExecute = false; // Required for child process
                Process p = Process.Start(startInfo);
                tx.DisposeLocalCopyOfClientHandle(); // Release unmanaged
                rx.DisposeLocalCopyOfClientHandle(); // handle resources.
                //tx.WriteByte(100);
                //Console.WriteLine("Server received: " + rx.ReadByte());
                //p.WaitForExit();    
                while (true)
                {
                    tx.WriteByte(100);
                    Console.WriteLine("Server received: " + rx.ReadByte());
                }

            }
        }

        //ClientDemo.exe的内容
        public static void AnonymousPipeClient()
        {
            //Thread.Sleep(TimeSpan.FromSeconds(1));
            //string rxID = args[0]; // Note we're reversing the
            //string txID = args[1]; // receive and transmit roles.
            using (var rx = new AnonymousPipeClientStream(PipeDirection.In, rxID))
            using (var tx = new AnonymousPipeClientStream(PipeDirection.Out, txID))
            {
                //Console.WriteLine("Client received: " + rx.ReadByte());
                //tx.WriteByte(200);
                while (true)
                {
                    Console.WriteLine("Client received: " + rx.ReadByte());
                    tx.WriteByte(200);
                }
            }
        }

        //public static void AnonymousPipeServer1()
        //{
        //    string clientExe = @"d:\PipeDemo\ClientDemo.exe";
        //    HandleInheritability inherit = HandleInheritability.Inheritable;
        //    using (var tx = new AnonymousPipeServerStream(PipeDirection.Out, inherit))
        //    using (var rx = new AnonymousPipeServerStream(PipeDirection.In, inherit))
        //    {
        //        string txID = tx.GetClientHandleAsString();
        //        string rxID = rx.GetClientHandleAsString();
        //        var startInfo = new ProcessStartInfo(clientExe, txID + " " + rxID);
        //        startInfo.UseShellExecute = false; // Required for child process
        //        Process p = Process.Start(startInfo);
        //        tx.DisposeLocalCopyOfClientHandle(); // Release unmanaged
        //        rx.DisposeLocalCopyOfClientHandle(); // handle resources.
        //        tx.WriteByte(100);
        //        Console.WriteLine("Server received: " + rx.ReadByte());
        //        p.WaitForExit();
        //    }
        //}

        ////ClientDemo.exe的内容
        //public static void AnonymousPipeClient1()
        //{
        //    string rxID = args[0]; // Note we're reversing the
        //    string txID = args[1]; // receive and transmit roles.
        //    using (var rx = new AnonymousPipeClientStream(PipeDirection.In, rxID))
        //    using (var tx = new AnonymousPipeClientStream(PipeDirection.Out, txID))
        //    {
        //        Console.WriteLine("Client received: " + rx.ReadByte());
        //        tx.WriteByte(200);
        //    }
        //}

        #endregion

        #region Namepipe

        public static void PipeServer()
        {
            var s = new System.IO.Pipes.NamedPipeServerStream("pipedream");
            s.WaitForConnection();
            while (true)
            {
                s.WriteByte(100);
                Console.WriteLine($"PipeServer 收到 客户端 数据:{s.ReadByte()}");
            }
        }

        public static void PipeClient()
        {
            var s = new System.IO.Pipes.NamedPipeClientStream("pipedream");
            s.Connect();
            while (true)
            {
                Console.WriteLine($"PipeClient 收到服务端数据:{s.ReadByte()}");
                Thread.Sleep(TimeSpan.FromSeconds(2));
                s.WriteByte(200); // Send the value 200 back.
            }
        }


        public static void PipeServerMessage()
        {
            var s = new System.IO.Pipes.NamedPipeServerStream("pipedream", PipeDirection.InOut, 1, PipeTransmissionMode.Message);
            s.WaitForConnection();
            while (true)
            {
                byte[] msg = Encoding.UTF8.GetBytes("Hello");
                s.Write(msg, 0, msg.Length);
                Console.WriteLine($"PipeServer 服务端 数据:{Encoding.UTF8.GetString(ReadMessage(s))}");
            }
        }

        public static void PipeClientMessage()
        {
            //var s = new NamedPipeClientStream("pipedream");
            var s = new NamedPipeClientStream("192.168.1.199", "pipedream");
            s.Connect();
            s.ReadMode = PipeTransmissionMode.Message;
            while (true)
            {
                Console.WriteLine($"PipeClient 收到数据:{Encoding.UTF8.GetString(ReadMessage(s))}");
                Thread.Sleep(TimeSpan.FromSeconds(2));
                byte[] msg = Encoding.UTF8.GetBytes("Hello right back!1111");
                s.Write(msg, 0, msg.Length);
                Console.WriteLine($"PipeClient 发送数据:Hello right back!111");
                //Thread.Sleep(TimeSpan.FromSeconds(2));
                //s.WriteByte(200); // Send the value 200 back.
            }
        }

        static byte[] ReadMessage(PipeStream s)
        {
            MemoryStream ms = new MemoryStream();
            byte[] buffer = new byte[0x1000]; // Read in 4 KB blocks
            do
            {
                ms.Write(buffer, 0, s.Read(buffer, 0, buffer.Length));
            }
            while (!s.IsMessageComplete);
            return ms.ToArray();
        }

        #endregion

 参考链接:https://www.cnblogs.com/shanranlei/p/3629901.html

posted @ 2021-08-20 16:19  龙骑科技  阅读(298)  评论(0编辑  收藏  举报