命名管道: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】:
NamedPipeClientStream
和 NamedPipeServerStream
自动为名称添加前缀“\\.\pipe\”。
C++ 客户端代码:
hPipe = CreateFile("\\\\.\\pipe\\mypipe", ...)
对应的C#服务器代码:
var pipe = new NamedPipeServerStream("mypipe", ...)
【讨论】:
@yaronkl 如果这个答案解决了你的问题,那么你应该把它标记为答案 从技术上讲,NamedPipeClientStream 和 NamedPipeServerStream 会在名称前添加“\\.\pipe\”。 Append 表示在文本之后添加。如果它们附加,名称“mypipe”将变成“mypipe\\.\pipe\”以上是关于命名管道:C# 服务器、C++ 客户端的主要内容,如果未能解决你的问题,请参考以下文章