C#服务器和C ++客户端之间的命名管道通信

时间:2016-04-08 17:58:00

标签: c# c++ named-pipes

我有一个C#服务器和一个C ++客户端。 C#服务器工作正常,因为我使用C#客户端测试它,并且来自客户端的所有消息都正确地传输到服务器。但是,在实现C ++客户端时,我似乎遇到了某些问题。

首先,这是我的C#服务器:

    Task.Factory.StartNew(() =>
                {
                    NamedPipeServerStream server = new NamedPipeServerStream(name);
                    server.WaitForConnection();

                    StreamReader reader = new StreamReader(server);

                    Console.WriteLine("Client connected");

                    while (true)
                    {
                        if (reader.ReadLine() != null)
                            Console.WriteLine(reader.ReadLine());
                    }
                });

name变量作为参数传递给方法。 我的C ++代码如下:

HANDLE hPipe;
    DWORD dwWritten;

    hPipe = CreateFile(TEXT("\\\\.\\pipe\\testpipe"),
        GENERIC_READ | GENERIC_WRITE,
        0,
        NULL,
        OPEN_EXISTING,
        0,
        NULL);
    if (hPipe != INVALID_HANDLE_VALUE)
    {
        WriteFile(hPipe,
            "Hello Pipe\n",
            12,   // = length of string + terminating '\0' !!!
            &dwWritten,
            NULL);

        CloseHandle(hPipe);
    }

服务器的输出如下:

[PIPE] Client connected
[PIPE] 

有人有任何建议吗?也许我错过了这一点,因为我对管道全新。

提前致谢。

1 个答案:

答案 0 :(得分:1)

如果没有能够可靠地再现问题的好Minimal, Complete, and Verifiable example,很难诊断代码,特别是网络代码。但是你的服务器的C#代码确实至少有一个明显的问题:

while (true)
{
    if (reader.ReadLine() != null)
        Console.WriteLine(reader.ReadLine());
}

在这里,您首先从流中读取一行,然后如果它不是null,则您会读取另一个行并显示该行。这意味着您要丢弃正在发送的所有其他行。

循环应该看起来更像这样:

string line;

while ((line = reader.ReadLine()) != null)
{
    Console.WriteLine(line);
}

我不明白你的C#客户端是如何工作的。也许它也被错误地实现了,在所需的行之前用空行来平衡服务器代码中的错误。