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

Posted

技术标签:

【中文标题】带有 c# 服务器的命名管道客户端 (c++)【英文标题】:Named pipe client (c++) with c# server 【发布时间】:2015-10-14 19:29:59 【问题描述】:

我想做的是有一个用 C++ 编写的命名管道客户端,以便能够与用 C# 编写的命名管道服务器进行通信。到目前为止,我一直无法做到这一点。

CreateFile 给我一个无效的句柄值,GetLastError 返回 2。

这里是c++部分(客户端)

#include "stdafx.h"
#include <windows.h> 
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#include <iostream>

using namespace std;

#define PIPE_NAME L"\\\\.\\pipe\\TestPipe"
#define BUFF_SIZE 512

int main()

    HANDLE hPipe;

    hPipe = CreateFile(PIPE_NAME, GENERIC_READ, 0, nullptr, OPEN_EXISTING, 0, nullptr);

    if (hPipe == INVALID_HANDLE_VALUE)
    
        cout << "INVALID_HANDLE_VALUE" << GetLastError() << endl;
        cin.get();
        return -1;
    

    cout << hPipe << endl;

    DWORD mode = PIPE_READMODE_MESSAGE;

    SetNamedPipeHandleState(hPipe, &mode, nullptr, nullptr);

    bool success = false;
    DWORD read;

    while(true)
    
        TCHAR chBuff[BUFF_SIZE];
        do
        
            success = ReadFile(hPipe, chBuff, BUFF_SIZE*sizeof(TCHAR), &read, nullptr);
         while (!success);

        _tprintf(TEXT("\"%s\"\n"), chBuff);
    

这里是服务器

using System;
using System.IO.Pipes;
using System.Text;

namespace BasicServer


    public static class Program
    
        private static NamedPipeServerStream _server;

        static void Main(string[] args)
        
            _server = new NamedPipeServerStream(@"\\.\pipe\TestPipe", PipeDirection.Out, 1, PipeTransmissionMode.Message);
            _server.WaitForConnection();
            Console.WriteLine(_server.IsConnected);
            Console.WriteLine("Client connected\n Sending message");
            byte[] buff = Encoding.UTF8.GetBytes("Test message");
            _server.Write(buff, 0, buff.Length);
            while (true)
            
                Console.ReadKey();
                Console.Write("\b \b");
            
        
    

我已经能够与用 C# 编写的客户端连接,但据我所知,c++ -> C# 通信应该是可能的。

这是我用 c# 编写的测试客户端,它可以工作

using System;
using System.IO.Pipes;
using System.Text;

namespace BasicClientC


    public class Program
    
        private static NamedPipeClientStream client;

        static void Main(string[] args)
        
            client = new NamedPipeClientStream(@".", @"\\.\pipe\TestPipe", PipeDirection.In);
            client.Connect();
            byte[] buffer = new byte[512];
            client.Read(buffer, 0, 512);
            Console.WriteLine(Encoding.UTF8.GetString(buffer));
            Console.ReadKey();
        
    

那么我的错误在哪里?

【问题讨论】:

【参考方案1】:

我知道为什么。

    在 C# 中创建管道时,仅使用 "TestPipe" 作为管道名称,不要将 \\.\pipe\ 作为管道名称的前缀。

    在 C++ 中,使用管道的完整路径:"\\.\pipe\TestPipe"。您的 C++ 逻辑不需要为此进行更改,因为您已经很好地定义了它:L"\\\\.\\pipe\\TestPipe"

This may help, as well。有趣的是,我在三年或更长时间前遇到过这种情况,现在一切都回到了我的身边。

【讨论】:

好的,你解决了连接问题,但我现在明白了,prolly 没有正确解释它我认为:S i.gyazo.com/77ec6b69d14aec6ad7a0cc3f5168f8fe.png 其中 0xA0 是 HANDLE hPipe 的值 @HyunMi 我注意到你在 C++ 逻辑中使用了TCHAR。您的应用程序是否针对 Unicode 字符? 是的,我只是忘记在我的测试服务器中更改它,:对不起 @HyunMi 如果您通过管道发送 Unicode 字符,您可能需要在命令提示符的设置中更改字体才能查看它们。查看更多详情:***.com/questions/22578567/…

以上是关于带有 c# 服务器的命名管道客户端 (c++)的主要内容,如果未能解决你的问题,请参考以下文章

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

WriteFile() 块(通过命名管道从 C++ 客户端写入 C# 服务器)

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

c#命名管道双向通信

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

使用命名管道将图像帧从 C++ 服务器发送到 C# 客户端