C# 在不关闭管道的情况下持续监听管道

C# 在不关闭管道的情况下持续监听管道,c#,named-pipes,C#,Named Pipes,我有一个32位winform应用程序将jpeg图像发送到64位winform应用程序。 我使用管道(IPC) 我不想关闭服务器管道并重新打开它,而是希望它保持打开状态,并在图像通过时进行处理 我想知道以下代码是否正确?另外,我如何知道何时收到完整字节数据包?我是否必须在客户端调用代码的字节数组中放入一个“头”,头4个字节保持整个字节数组/数据包的大小,就像我在套接字中一样?有没有更简单的方法来处理管道 这是我的服务器管道代码: static NamedPipeServerStream p

我有一个32位winform应用程序将jpeg图像发送到64位winform应用程序。 我使用管道(IPC)

我不想关闭服务器管道并重新打开它,而是希望它保持打开状态,并在图像通过时进行处理

我想知道以下代码是否正确?另外,我如何知道何时收到完整字节数据包?我是否必须在客户端调用代码的字节数组中放入一个“头”,头4个字节保持整个字节数组/数据包的大小,就像我在套接字中一样?有没有更简单的方法来处理管道

这是我的服务器管道代码:

    static NamedPipeServerStream pipeServer = null;
    public static void WaitForConnectionCallBack(IAsyncResult iar)
    {
        pipeServer = (NamedPipeServerStream)iar.AsyncState;
        pipeServer.EndWaitForConnection(iar);
        while (pipeServer != null)
        {
            if (pipeServer.IsConnected == true)
            {
                byte[] imageData = new byte[100000];
                pipeServer.Read(imageData, 0, imageData.Length);
                //do stuff with data
            }
        }
    }
    static string _pipeName = "";
    public static void Listen(string PipeName)
    {
        // Set to class level var so we can re-use in the async callback method
        _pipeName = PipeName;
        // Create the new async pipe 
        NamedPipeServerStream pipeServer = new NamedPipeServerStream(PipeName,
           PipeDirection.In, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous);
        // Wait for a connection
        pipeServer.BeginWaitForConnection(new AsyncCallback(WaitForConnectionCallBack), pipeServer);
    }

您好,我认为添加带有数组长度/大小的标题是很好的
也许可以添加一个校验和什么的

HI Max,是的,这就是我传统上使用套接字的方式。我以前从未使用过管道,所以我想知道是否还有其他选择。我会让这个问题持续一段时间:)@AndrewSimpson必须这样做并不是套接字所特有的。硬盘上的管道、套接字甚至文件都是“流”,如果您想通过它们传输数据,您需要一种带有分隔符的预定义格式(例如查看流中是否有
\0
\r\n
),或者您需要显示字段大小的标题信息。@ScottChamberlain HI,谢谢你的澄清。有意义。重要注意事项是,当您重新编写此文件时,
int-Read(byte[]buffer,int-offset,int-length)
最多只能读取
length
字节。你需要检查函数返回的结果,它会告诉你有多少字节真正被读取并保存到
缓冲区
@ScottChamberlain中,你说的很有道理。谢谢:)