管道无法正确读取数据

时间:2019-07-07 10:49:41

标签: c# c++ named-pipes

C ++方面

hPipe = CreateFile(TEXT((LPTSTR)"\\\\.\\pipe\\PIPENAME"), GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
char buf[100];
DWORD cbWritten;

if ((hPipe == NULL || hPipe == INVALID_HANDLE_VALUE))
{
    printf("Could not open the pipe  - (error %d)\n", GetLastError());

}
else
{
    do
    {
        printf("Enter your message: ");
        scanf_s("%s", buf);
        WriteFile(hPipe, buf, (DWORD)strlen(buf), &cbWritten, NULL);
        memset(buf, 0xCC, 100);


    } while (true);
}
memset(buf, 0xCC, 100);

现在这就是我要发送数据到我的C#程序的一面 这是C#代码

 using (var pipeServer = new NamedPipeServerStream("PIPENAME", PipeDirection.InOut))
        {
            using (var reader = new StreamReader(pipeServer))
            {
                using (var writer = new StreamWriter(pipeServer))
                {
                    var running = true;
                    MessageBox.Show("Server is waiting for a client");
                    pipeServer.WaitForConnection();
                    MessageBox.Show("Server: Prompting for Input");
                    writer.Flush();
                    while (running)
                    {
                        //pipeServer.WaitForPipeDrain();
                        var message = reader.ReadToEnd();
                        MessageBox.Show("Received message: " + message);
                        if (message.Equals("quit"))
                        {
                            writer.WriteLine("quit");
                            running = false;
                        }
                    }
                }
            }
        }
        Console.WriteLine("Server Quits");

我也尝试过使用ReadLine,但是它一直读到关闭c ++管道端为止

基本上,我正在尝试从C ++端发送一条消息,例如“ Message1” 而且c#端必须阅读它。

但是在atm上,当我发送消息“ Message1”时,什么也没有发生,如果我再发送“ Message2”,则也无任何反应。但是如果我关闭程序(在cpp端),它将收到“ Message1Message2”

1 个答案:

答案 0 :(得分:3)

ReadLine()在返回之前寻找行尾字符序列或流的结尾。

退出C ++代码时,管道关闭,因此您看到ReadLine返回。但是对于单个消息,您没有发送行尾序列。

请参考scanf()系列功能的s type specifier

  

字符串,最多第一个空格字符(空格,制表符或换行符)。

即。您发送的数据中不包含任何输入的行尾。