【问题标题】:named pipe between python 2.7 and c# using Message Modepython 2.7和c#之间使用消息模式的命名管道
【发布时间】:2017-02-23 02:02:18
【问题描述】:

我正在尝试在 python 2.7 和 C# 应用程序之间建立命名管道(2 路)。它适用于字节模式,但是当我在 python 服务器端更改为消息模式时,C# 客户端声称它仍然是字节模式。

这是我的 python 代码

import win32pipe, win32file

p = win32pipe.CreateNamedPipe("\\\\.\\pipe\\test_pipe",
    win32pipe.PIPE_ACCESS_DUPLEX,
    win32pipe.PIPE_TYPE_MESSAGE|win32pipe.PIPE_READMODE_MESSAGE | win32pipe.PIPE_WAIT,
    1, 65536, 65536,300,None)

print("Waiting for connection");
win32pipe.ConnectNamedPipe(p, None)
print("Client has connected")
win32file.WriteFile(p, "TestMessage".encode('utf-8'))
p.close()

我的C#-代码

class Program
{
    static void Main(string[] args)
    {
        using (NamedPipeClientStream clientStream = new NamedPipeClientStream(".", "test_pipe", PipeDirection.InOut))
        {
            clientStream.Connect();
            Console.WriteLine("Connected");
            string inMessage = ProcessSingleReceivedMessage(clientStream);
            Console.WriteLine("in Message " + inMessage);
        }
        Console.ReadLine();
    }


    private static string ProcessSingleReceivedMessage(NamedPipeClientStream namedPipeClient)
    {
        Console.WriteLine("Transmission mode: " + namedPipeClient.TransmissionMode);
        StringBuilder messageBuilder = new StringBuilder();
        string messageChunk = string.Empty;
        byte[] messageBuffer = new byte[5];
        do
        {
            namedPipeClient.Read(messageBuffer, 0, messageBuffer.Length);
            messageChunk = Encoding.UTF8.GetString(messageBuffer);
            messageBuilder.Append(messageChunk);
            messageBuffer = new byte[messageBuffer.Length];
        }
        while (!namedPipeClient.IsMessageComplete);
        return messageBuilder.ToString();
    }}

为了简单起见,我只发布了从 python 到 C# 的传输,因为这里出现了错误。 c# 客户端出于某种原因认为传输是字节,因此发生 InvalidOperationException 说“ReadMode 不是 PipeTransmissionMode.Message。”我做错了什么。

【问题讨论】:

    标签: c# python-2.7 named-pipes


    【解决方案1】:

    使用命名管道,客户端和服务器都必须单独设置管道一侧的读取模式。仅将一侧设置为消息模式是不够的。在 C# 中的 clientStream.Connect(); 下方添加这一行。

    clientStream.ReadMode = PipeTransmissionMode.Message;
    

    有关详细信息,请参阅以下内容:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多