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

Named pipe communication between C# server and C++ client

我有一个 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 '[=11=]' !!!
            &dwWritten,
            NULL);

        CloseHandle(hPipe);
    }

服务器的输出如下:

[PIPE] Client connected
[PIPE] 

有人有什么建议吗?也许我完全错了,因为我是管道新手。

提前致谢。

如果没有可靠地重现问题的良好 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# 客户端是如何工作的。也许它也未正确实现,在所需行之前加上空行以平衡服务器代码中的错误。