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

3
我编写了两对命名管道客户端/服务器程序: 第一对是用C#(.NET 4)编写的 第二对是用C++(非托管)编写的
所有4个测试程序都使用相同的管道名称\\.\pipe\mypipe C#对可以互相正常工作-我从客户端发送消息,服务器就会接收到。 C++对也可以互相正常工作。
但是...当我尝试运行C#客户端与C++服务器或C++客户端与C#服务器时,它们无法连接。客户端无法连接到服务器。
是否有什么阻止C++客户端与.NET服务器配合工作的东西? 这样做应该可以吗?
谢谢。

如果您正在发送二进制数据,您确定两个实现之间的二进制格式匹配吗? - crashmstr
问题出现在发送数据之前。问题是客户端打开通道失败。 - yaronkl
它是怎样失败的?你是否得到了异常,应用程序是否出现了挂起的情况? - thorkia
这是客户端打开管道的方式:<pre> hPipe=CreateFile("\\.\pipe\mypipe", GENERIC_WRITE,//GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL) ; if ( hPipe!=INVALID_HANDLE_VALUE) { return 0; //成功!!! } err = GetLastError(); if(err!=ERROR_PIPE_BUSY) { printf("无法打开管道,GetLastError=%u\n", err); return -1 ; } </pre> CreateFile返回一个无效的句柄。GetLastError()返回2。 - yaronkl
1
C# 的 NamedPipeClientStream 和 NamedPipeServerStream 会自动将 ".\pipe" 添加到名称中。 - alexm
显示剩余3条评论
1个回答

8
NamedPipeClientStreamNamedPipeServerStream自动在名称前加上"\\.\pipe\"前缀。
C++客户端代码:
hPipe = CreateFile("\\\\.\\pipe\\mypipe", ...)

相应的C#服务器代码:

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

如果@yaronkl的问题得到了解决,那么您应该将其标记为答案。 - crashmstr
2
从技术上讲,NamedPipeClientStream 和 NamedPipeServerStream 会在名称前面添加 "\.\pipe"。Append 的意思是在文本后面添加。如果它们附加了,那么名称 "mypipe" 将变成 "mypipe\.\pipe"。 - thorkia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接