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

本文关键字:客户端 c++ 管道 服务器 带有 | 更新日期: 2023-09-27 18:17:54

我想做的是有一个用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();
        }
    }
}

那么我的错误在哪里?

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

我知道为什么。

  1. 在c#中创建管道时,只使用"TestPipe"作为管道的名称,不要将''.'pipe'作为该管道名称的前缀。

  2. 在c++中,使用管道的全路径:"''.'pipe'TestPipe"。您的c++逻辑不需要为此更改,因为您已经定义了它:L"''''.''pipe''TestPipe"

这也可能有帮助。有趣的是,我在三年前或更早的时候就遇到了这个,现在它又回来了。