`
jiq408694711
  • 浏览: 36587 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

C#使用匿名管道在本地进程之间进行通信

 
阅读更多

from CSDN

匿名管道提供的功能比命名管道少,但它需要的系统开销也少。您可以使用匿名管道更加轻松地在本地计算机上进行进程间通信。不能使用匿名管道通过网络进行通信。


下面的示例演示使用匿名管道将字符串从父进程发送到子进程的方式。此示例使用OutPipeDirection值在父进程中创建一个AnonymousPipeServerStream对象。然后,父进程通过使用客户端句柄创建一个AnonymousPipeClientStream对象来创建一个子进程。该子进程的In值为PipeDirection

然后,父进程将用户提供的字符串发送给子进程。该字符串将显示在子进程中的控制台上。

下面的示例演示服务器进程。

using System;
using System.IO;
using System.IO.Pipes;
using System.Diagnostics;

class PipeServer
{
    static void Main()
    {
        Process pipeClient = new Process();

        pipeClient.StartInfo.FileName = "pipeClient.exe";

        using (AnonymousPipeServerStream pipeServer =
            new AnonymousPipeServerStream(PipeDirection.Out,
            HandleInheritability.Inheritable))
        {
            // Show that anonymous pipes do not support Message mode.
            try
            {
                Console.WriteLine("[SERVER] Setting ReadMode to \"Message\".");
                pipeServer.ReadMode = PipeTransmissionMode.Message;
            }
            catch (NotSupportedException e)
            {
                Console.WriteLine("[SERVER] Exception:\n    {0}", e.Message);
            }

            Console.WriteLine("[SERVER] Current TransmissionMode: {0}.",
                pipeServer.TransmissionMode);

            // Pass the client process a handle to the server.
            pipeClient.StartInfo.Arguments =
                pipeServer.GetClientHandleAsString();
            pipeClient.StartInfo.UseShellExecute = false;
            pipeClient.Start();

            pipeServer.DisposeLocalCopyOfClientHandle();

            try
            {
                // Read user input and send that to the client process.
                using (StreamWriter sw = new StreamWriter(pipeServer))
                {
                    sw.AutoFlush = true;
                    // Send a 'sync message' and wait for client to receive it.
                    sw.WriteLine("SYNC");
                    pipeServer.WaitForPipeDrain();
                    // Send the console input to the client process.
                    Console.Write("[SERVER] Enter text: ");
                    sw.WriteLine(Console.ReadLine());
                }
            }
            // Catch the IOException that is raised if the pipe is broken
            // or disconnected.
            catch (IOException e)
            {
                Console.WriteLine("[SERVER] Error: {0}", e.Message);
            }
        }

        pipeClient.WaitForExit();
        pipeClient.Close();
        Console.WriteLine("[SERVER] Client quit. Server terminating.");
    }
}

下面的示例演示客户端进程。服务器进程启动客户端进程,并为该进程提供一个客户端句柄。应该将从客户端代码得到的可执行文件命名为pipeClient.exe并在运行该服务器进程之前将其复制到服务器可执行文件所在的目录中。

using System;
using System.IO;
using System.IO.Pipes;

class PipeClient
{
    static void Main(string[] args)
    {
        if (args.Length > 0)
        {
            using (PipeStream pipeClient =
                new AnonymousPipeClientStream(PipeDirection.In, args[0]))
            {
                // Show that anonymous Pipes do not support Message mode.
                try
                {
                    Console.WriteLine("[CLIENT] Setting ReadMode to \"Message\".");
                    pipeClient.ReadMode = PipeTransmissionMode.Message;
                }
                catch (NotSupportedException e)
                {
                    Console.WriteLine("[CLIENT] Execption:\n    {0}", e.Message);
                }

                Console.WriteLine("[CLIENT] Current TransmissionMode: {0}.",
                   pipeClient.TransmissionMode);

                using (StreamReader sr = new StreamReader(pipeClient))
                {
                    // Display the read text to the console
                    string temp;

                    // Wait for 'sync message' from the server.
                    do
                    {
                        Console.WriteLine("[CLIENT] Wait for sync...");
                        temp = sr.ReadLine();
                    }
                    while (!temp.StartsWith("SYNC"));

                    // Read the server data and echo to the console.
                    while ((temp = sr.ReadLine()) != null)
                    {
                        Console.WriteLine("[CLIENT] Echo: " + temp);
                    }
                }
            }
        }
        Console.Write("[CLIENT] Press Enter to continue...");
        Console.ReadLine();
    }
}



分享到:
评论

相关推荐

    C#管道通信

    1. **匿名管道**:匿名管道是临时的,只能在具有继承关系的进程之间使用。在C#中,我们可以使用`System.IO.Pipes.AnonymousPipeServerStream`和`System.IO.Pipes.AnonymousPipeClientStream`类创建和连接匿名管道。...

    c# 管道的使用 使用DOS

    命名管道可以在同一台计算机的不同进程之间提供通信,而匿名管道通常用于父进程和子进程之间的通信。在这个项目中,我们可能会看到如何创建一个命名管道,以便从C#应用程序发送命令到DOS并接收返回的结果。 首先,...

    管道通信源码,C#和C++

    管道通信是一种在进程间共享数据的有效方式,尤其在多进程或跨进程通信中扮演着重要角色。本资源提供了C#和C++两种编程语言实现的管道通信源码,包括命名管道和匿名管道的实例,所有代码都已经过测试,可以直接应用...

    C# 命名管道 异步通信的例子

    命名管道在计算机网络编程中是一种进程间通信(IPC,Inter-Process Communication)的方式,尤其在Windows操作系统中广泛应用。它允许不同进程之间的数据交换,就像通过一个物理管道一样。C# 提供了System.IO.Pipes...

    C#通信总结 含管道通信的代码

    通过.NET Remoting,C#程序可以透明地访问远程对象,仿佛它们就在本地进程中一样。这涉及到序列化和反序列化对象,以及通道服务(如HTTP、TCP或命名管道)的选择。设置.NET Remoting涉及创建远程对象,配置服务器和...

    关于C#多进程的小例子

    1. **管道(命名管道或匿名管道)**:允许进程之间双向通信。使用`System.IO.Pipes`命名空间中的类,如`NamedPipeServerStream`和`NamedPipeClientStream`。 2. **套接字(Sockets)**:适用于跨网络的进程间通信。...

    Windows管道通信技术[C#]

    匿名管道仅在具有共同父进程的子进程之间工作,而命名管道可以在任何进程之间进行通信,只要它们知道管道的名称。 二、C#中的命名管道 在C#中,`System.IO.Pipes`命名空间提供了用于创建和操作命名管道的类。主要的...

    C# 管道通信

    - **网络通信**:除了在同一台计算机上的进程间通信外,命名管道还支持不同计算机之间的通信。 - **多服务器实例**:允许存在多个服务器实例来处理不同的客户端请求。 - **基于消息的通信**:通信过程中数据被包装成...

    VC++和C#管道通信(2015更新)

    在Windows环境下,管道通信通常分为匿名管道和命名管道两种。本示例重点讲解的是命名管道,因为命名管道允许跨进程甚至跨网络的通信,而VC++和C#作为两种不同编程语言的代表,可以通过命名管道实现通信。 VC++是...

    管道通信C#与进程启动信息查看源代码

    命名管道允许在同一台计算机或跨网络的进程之间建立通信,而匿名管道则主要用于同一台计算机内的父子进程之间。这里我们将主要讨论命名管道,因为标题中提到的是进程启动信息查看,这通常涉及到跨进程通信。 命名...

    匿名管道双向通讯

    匿名管道是一种在进程间通信(IPC,Inter-Process Communication)技术中常见的方法,尤其在Windows操作系统环境下。它允许两个相关联的进程之间进行数据交换,这些进程通常是由同一个父进程创建的子进程。在"匿名...

    进程间通信_进程间通信_

    .NET Remoting是早期的跨进程通信方式,虽然现在已被WCF取代,但在某些场景下仍有应用。发送方创建远程对象,接收方通过通道访问该对象,调用其方法。 在实现进程间通信时,必须注意以下几点: - 锁定和同步:当多...

    c++与c#命名管道

    在C++和C#之间使用命名管道进行通信,可以实现高效且低延迟的数据交换,尤其适用于在同一台计算机上运行的进程间通信。然而,跨网络的通信可能需要其他机制,如TCP/IP套接字。对于更复杂的需求,可以研究Windows消息...

    双管道(CreatePipe)与本地cmd.exe进程通信.exe

    在本地,用父进程创建一个cmd.exe子进程,这个子进程的输入输出被重定向到两条匿名管道,从而实现与父进程通信。父进程输入命令到一条管道,子进程读取后执行并输出到另一条管道,父进程读取后输出到窗口。此版本源...

    C#管道通信总结的实例及文档代码

    命名管道可以跨网络和多个会话工作,而匿名管道则主要用于同一台计算机上的进程间通信。 在提供的压缩包中,"codefans.net"可能是一个包含源代码、文档或其他相关资源的文件或目录,这部分内容将帮助我们深入理解并...

    匿名管道实现控制台重定向

    匿名管道是Windows操作系统中进程间通信(IPC,Inter-Process Communication)的一种机制,它允许父进程与子进程之间共享数据流。在本例中,“匿名管道实现控制台重定向”是指将控制台输出(如命令行程序的打印信息...

    操作系统进程通信Java源码

    3. **命名管道(Named Pipes)**:在Java中,通常使用`java.nio.channels.Pipe`类来创建命名管道,相比匿名管道,它提供了一种跨进程通信的方式,但Java对命名管道的支持不如其他语言如C++或C#。 4. **套接字...

    进程将通信

    C#提供了命名管道(Named Pipes)和匿名管道(Anonymous Pipes)两种类型,这里主要讨论命名管道,因为它是跨进程通信更常用的一种。 命名管道在进程间提供了一条单向或双向的数据流通道,可以实现半双工或全双工...

    匿名管道变得轻松

    匿名管道是一种进程间通信(IPC, Inter-Process Communication)方式,它允许两个进程之间共享数据,通常是父进程与子进程之间。在Windows操作系统下,匿名管道是基于内核对象实现的。 描述中的“C#中用于匿名管道...

    详解Python进程间通信之命名管道

    命名管道是在传统匿名管道基础上的扩展,具有持久性,可以在进程间提供单向通信通道。 ### 命名管道的基本概念 1. **管道(Pipe)**:管道是一种简单的FIFO(先进先出)通信信道,数据只能从一端写入,另一端读出。...

Global site tag (gtag.js) - Google Analytics