命名管道:C# 服务器、C++ 客户端

Posted

技术标签:

【中文标题】命名管道:C# 服务器、C++ 客户端【英文标题】:Named pipes: C# server, C++ client 【发布时间】:2016-02-16 10:59:26 【问题描述】:

我编写了 2 对命名管道客户端/服务器程序: C# (.NET 4) 中的第一对 C++ 中的第二对(非托管)

所有 4 个测试程序都使用相同的管道名称 \\.\pipe\mypipe

这对 C# 对彼此正常工作 - 我从客户端发送一条消息,然后由服务器接收。 这对 C++ 对彼此也可以正常工作。

但是...当我尝试使用 C++ 服务器运行 C# 客户端或使用 C# 服务器运行 C++ 客户端时,它不起作用。客户端无法连接到服务器。

是否有什么东西阻止 C++ 客户端与 .NET 服务器一起工作? 它应该工作吗?

谢谢。

【问题讨论】:

如果你发送的是二进制数据,你确定两个实现的二进制格式匹配吗? 问题出在发送数据之前。问题是在客户端打开管道失败。 它是如何失败的?您是否遇到异常,应用是否挂起? 这是客户端打开管道的方式:
 hPipe=CreateFile("\\\\.\\pipe\\mypipe", GENERIC_WRITE,//GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL) ;如果(hPipe!=INVALID_HANDLE_VALUE)返回0; //成功!!!  错误 = GetLastError(); if(err!=ERROR_PIPE_BUSY)  printf("无法打开管道,GetLastError=%u\n", err);返回 -1 ;  
创建文件返回无效句柄。 GetLastError() 返回 2。
C#的NamedPipeClientStream,NamedPipeServerStream会自动在名字后面追加“\.\\pipe\”。 【参考方案1】:

NamedPipeClientStreamNamedPipeServerStream 自动为名称添加前缀“\\.\pipe\”。

C++ 客户端代码:

hPipe = CreateFile("\\\\.\\pipe\\mypipe", ...)

对应的C#服务器代码:

var pipe = new NamedPipeServerStream("mypipe", ...)

【讨论】:

@yaronkl 如果这个答案解决了你的问题,那么你应该把它标记为答案 从技术上讲,NamedPipeClientStream 和 NamedPipeServerStream 会在名称前添加“\\.\pipe\”。 Append 表示在文本之后添加。如果它们附加,名称“mypipe”将变成“mypipe\\.\pipe\”

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

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

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

c#命名管道双向通信

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

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

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