C# 从C+连接到命名管道时遇到问题+;win32程序
我有两个在同一台计算机上运行的程序,我需要它们对话。一个是用老的Windows 32框架在C++中编写的现有程序。另一个是使用.NET框架编写的新C#应用程序。我较新的.NET应用程序将充当服务器,而较旧的现有应用程序将充当客户端 我已经在客户端和服务器上创建了命名管道。我只是无法让他们联系上。我怀疑问题只是我没有正确匹配文件名(命名管道在后台使用文件) 以下是.NET服务器代码:C# 从C+连接到命名管道时遇到问题+;win32程序,c#,c++,.net,winapi,named-pipes,C#,C++,.net,Winapi,Named Pipes,我有两个在同一台计算机上运行的程序,我需要它们对话。一个是用老的Windows 32框架在C++中编写的现有程序。另一个是使用.NET框架编写的新C#应用程序。我较新的.NET应用程序将充当服务器,而较旧的现有应用程序将充当客户端 我已经在客户端和服务器上创建了命名管道。我只是无法让他们联系上。我怀疑问题只是我没有正确匹配文件名(命名管道在后台使用文件) 以下是.NET服务器代码: private volatile NamedPipeServerStream pipeServer;
private volatile NamedPipeServerStream pipeServer;
pipeServer = new NamedPipeServerStream("MyPipe", PipeDirection.InOut);
pipeServer.WaitForConnection();
以下是较旧的现有win32客户端代码:
HANDLE pipe = CreateFile(
"\\Device\\NamedPipe\\MyPipe",
GENERIC_READ | GENERIC_WRITE, // only need read access
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
我首先运行服务器代码,它就在那里等待连接。每次我的句柄等于无效的\u句柄\u值时
我使用ProcessExplorer查看是否可以找到管道的真实名称。根据ProcessExplorer,名称为\Device\NamedPipe\MyPipe
我想我是在我的客户端匹配这一点。如果有人能提出建议,我将不胜感激。谢谢。要使用
CreateFile
打开命名管道,您需要将文件名指定为\\.\pipe\name
,因此在您的情况下,它看起来像:
HANDLE pipe = CreateFile(
"\\\\.\\Pipe\\MyPipe",
GENERIC_READ | GENERIC_WRITE, // only need read access
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
要使用
CreateFile
打开命名管道,您需要将文件名指定为\\.\pipe\name
,因此在您的情况下,它看起来像:
HANDLE pipe = CreateFile(
"\\\\.\\Pipe\\MyPipe",
GENERIC_READ | GENERIC_WRITE, // only need read access
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
设置
PipeSecurity
为我解决了这个问题。让每个人都能访问它
看起来不那么安全,但它起了作用
PipeSecurity ps = new PipeSecurity();
PipeAccessRule psRule = new PipeAccessRule(@"Everyone", PipeAccessRights.ReadWrite, System.Security.AccessControl.AccessControlType.Allow);
ps.AddAccessRule(psRule);
NamedPipeServerStream pipeServer = new NamedPipeServerStream("datapipe", PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous, 1, 1, ps);
来源:设置
PipeSecurity
为我解决了这个问题。让每个人都能访问它
看起来不那么安全,但它起了作用
PipeSecurity ps = new PipeSecurity();
PipeAccessRule psRule = new PipeAccessRule(@"Everyone", PipeAccessRights.ReadWrite, System.Security.AccessControl.AccessControlType.Allow);
ps.AddAccessRule(psRule);
NamedPipeServerStream pipeServer = new NamedPipeServerStream("datapipe", PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous, 1, 1, ps);
来源:内核看到的
\Device\NamedPipe\MyPipe
是设备路径。根据Jerry的回答,Win32子系统使用不同的语法。\Device\NamedPipe\MyPipe
是内核看到的设备路径。根据Jerry的回答,Win32子系统使用了不同的语法。是的,就是这样。我最初尝试过这个方法,但是使用了“pipe”而不是“pipe”,正如下面的web示例()所示。在那个例子中,两个应用程序都使用了win32框架,所以它似乎已经成功了。我的猜测是.NET抽象默认使用大写“Pipe”。使用大写名称,现在对我有效。我希望这能帮助将来可能在这方面苦苦挣扎的其他人。谢谢你的帮助。是的,就是这样。我最初尝试过这个方法,但是使用了“pipe”而不是“pipe”,正如下面的web示例()所示。在那个例子中,两个应用程序都使用了win32框架,所以它似乎已经成功了。我的猜测是.NET抽象默认使用大写“Pipe”。使用大写名称,现在对我有效。我希望这能帮助将来可能在这方面苦苦挣扎的其他人。谢谢你的帮助。