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

Posted

技术标签:

【中文标题】C# 服务器和 C++ 客户端之间的命名管道通信【英文标题】:Named pipe communication between C# server and C++ client 【发布时间】:2016-04-08 17:57:59 【问题描述】:

我有一个 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] 

有人有什么建议吗?也许我完全错了,因为我对管道完全陌生。

提前致谢。

【问题讨论】:

您是否尝试过在关闭 C++ 端的句柄之前刷新文件缓冲区? msdn.microsoft.com/en-us/library/windows/desktop/… 我在调用 WriteFile() 后添加了 FlushFileBuffers(hPipe) 但仍然没有。 【参考方案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# 客户端是如何工作的。也许它也被错误地实现了,在所需的行之前加上空行以平衡服务器代码中的错误。

【讨论】:

这实际上解决了整个问题。我在 Codeproject 的某个地方找到了 C# 代码,并认为它工作正常。非常感谢。

以上是关于C# 服务器和 C++ 客户端之间的命名管道通信的主要内容,如果未能解决你的问题,请参考以下文章

使用命名管道的两种 C++ 到 C# 通信

命名管道 C# 服务器 C++ .dll 客户端不工作?

UWP C# 管道客户端无法连接到 Win32 C++ 管道服务器

带有 c# 服务器的命名管道客户端 (c++)

C# 进程通信-命名管道

在c#中使用命名管道在两个进程之间进行双工操作