为 Intranet 主机创建 C++ 命名管道

Posted

技术标签:

【中文标题】为 Intranet 主机创建 C++ 命名管道【英文标题】:Creating C++ Named Pipes for Intranet hosts 【发布时间】:2013-11-11 08:11:13 【问题描述】:

我一直在尝试使用微软代码创建命名管道:

http://code.msdn.microsoft.com/windowsdesktop/CppNamedPipeClient-a88eb958

我还从其他地方获取了安全令牌:

SECURITY_ATTRIBUTES sa;
    sa.lpSecurityDescriptor = (PSECURITY_DESCRIPTOR)malloc(
        SECURITY_DESCRIPTOR_MIN_LENGTH);
    InitializeSecurityDescriptor(sa.lpSecurityDescriptor, 
        SECURITY_DESCRIPTOR_REVISION);
    // ACL is set as NULL in order to allow all access to the object.
    SetSecurityDescriptorDacl(sa.lpSecurityDescriptor, TRUE, NULL, FALSE);
    sa.nLength = sizeof(sa);
    sa.bInheritHandle = TRUE;

我想在我的 ip 上声明服务器而不是本地,以便它被 Intranet 上的其他电脑访问:

#define SERVER_NAME         L"10.12.13.122" ("." works)
#define PIPE_NAME           L"SamplePipe"
#define FULL_PIPE_NAME      L"\\\\" SERVER_NAME L"\\pipe\\" PIPE_NAME

之前有没有人为 C++ 声明过这个?这是拒绝创建命名管道...

【问题讨论】:

您收到什么错误代码/消息?在创建管道的服务器端(即在 CreateNamedPipe() 中)或在客户端(即在 CreateFile() 中)时是否会发生错误?您是否尝试将 NULL 作为您的安全属性? 服务器端,0x7b 【参考方案1】:

0x7B 是 ERROR_INVALID__NAME。 “管道服务器无法在另一台计算机上创建管道,因此 CreateNamedPipe 必须使用句点作为服务器名称,如以下示例所示 \\.\pipe\PipeName”:请参阅MSDN。不要忘记将字符串文字的反斜杠加倍。

【讨论】:

以上是关于为 Intranet 主机创建 C++ 命名管道的主要内容,如果未能解决你的问题,请参考以下文章

c++下使用命名管道实现进程间通信

在java中创建命名管道

通过命名管道访问单例会创建第二个单例。未在主机端触发的事件

#yyds干货盘点#--k8s-网络模型

c#命名管道双向通信

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