看流星社区

 找回密码
 注册账号
查看: 1981|回复: 0

使用命名管道通过网络在进程之间进行通信

[复制链接]

该用户从未签到

发表于 2013-5-2 09:27:56 | 显示全部楼层 |阅读模式
命名管道提供的功能比匿名管道多。 其功能包括通过网络进行全双工通信和多个服务器实例;基于消息的通信;以及客户端模拟,这使得连接进程可在远程服务器上使用其自己的权限集。

下面的示例演示如何使用 NamedPipeClientStream 类创建命名管道。在此示例中,服务器进程创建了四个线程。每个线程可以接受一个客户端连接。连接的客户端进程随后向服务器提供一个文件名。如果客户端具有足够的权限,服务器进程就会打开文件并将其内容发送回客户端。

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

class PipeServer
{
    static int numThreads = 4;

    static void Main()
    {
        for (int i = 0; i < numThreads; i++)
        {
            Thread newThread = new Thread(ServerThread);
            newThread.Start();
        }
        Console.WriteLine("Press enter to exit.");
        Console.ReadLine();
    } // Main()

    private static void ServerThread(object data)
    {
        NamedPipeServerStream pipeServer =
            new NamedPipeServerStream("testpipe", PipeDirection.InOut, numThreads);
        Console.WriteLine("NamedPipeServerStream thread created.");

        // Wait for a client to connect
        pipeServer.WaitForConnection();

        Console.WriteLine("Client connected.");
        try
        {
            // Read the request from the client. Once the client has
            // written to the pipe its security token will be available.
            StreamReader sr = new StreamReader(pipeServer);
            StreamWriter sw = new StreamWriter(pipeServer);
            sw.AutoFlush = true;

            // Verify our identity to the connected client using a
            // string that the client anticipates.
             sw.WriteLine("I am the one true server!");

            // Obtain the filename from the connected client.
            string filename = sr.ReadLine();

            // Read in the contents of the file while impersonating the client.
            ReadFileToStream fileReader = new ReadFileToStream(pipeServer, filename);

            // Display the name of the user we are impersonating.
            Console.WriteLine("Reading file: {0} as user {1}.",
                pipeServer.GetImpersonationUserName(), filename);

            pipeServer.RunAsClient(fileReader.Start);

            pipeServer.Disconnect();
        }
        // Catch the IOException that is raised if the pipe is broken
        // or disconnected.
        catch (IOException e)
        {
            Console.WriteLine("ERROR: {0}", e.Message);
        }
        pipeServer.Close();
    } // ServerThread()
} // PipeServer

class ReadFileToStream
{
    private string m_filename;
    private Stream m_stream;

    public ReadFileToStream(Stream stream, string filename)
    {
        m_filename = filename;
        m_stream = stream;
    } // ReadFileToStream(stream, filename)

    public void Start()
    {
        StreamWriter sw = new StreamWriter(m_stream);
        string contents = File.ReadAllText(m_filename);
        sw.WriteLine(contents);
        sw.Flush();
    } // Start()
} // ReadFileToStream


下面的示例演示使用 NamedPipeClientStream 类的客户端进程。客户端连接服务器进程并向服务器发送一个文件名。服务器随后将文件内容发送回客户端。文件内容随后显示在控制台上。

using System;
using System.IO;
using System.IO.Pipes;
using System.Security.Principal;

class PipeClient
{
    //static int numThreads = 4;

    static void Main()
    {
        NamedPipeClientStream pipeClient =
            new NamedPipeClientStream("localhost", "testpipe",
            PipeDirection.InOut, PipeOptions.None,
            TokenImpersonationLevel.Impersonation);
        StreamWriter sw = new StreamWriter(pipeClient);
        StreamReader sr = new StreamReader(pipeClient);
        pipeClient.Connect();
        sw.AutoFlush = true;

        // Verify that this is the "true server"
        if (sr.ReadLine() == "I am the one true server!")
        {
            // The client security token is sent with the first write.
            sw.WriteLine("c:\\textfile.txt");

            // Print the file to the screen.
            char[] buffer = new char[32];
            int n;
            do
            {
                n = sr.Read(buffer, 0, buffer.Length);
                Console.Write(buffer, 0, n);
            }
            while (n > 0);
        }
        else
        {
            Console.WriteLine("Server could not be verified.");
        }
        pipeClient.Close();
    } // Main()
}

可靠编程
此示例中的客户端进程和服务器进程预期在同一台计算机上运行,因此提供给 NamedPipeClientStream 对象的服务器名称是 "localhost"。如果客户端进程和服务器进程位于不同的计算机上,则应该用运行服务器进程的计算机的网络名称来替换 "localhost"。
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-5-15 00:48

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表