【问题标题】:Simply way of getting all open named pipes获取所有打开的命名管道的简单方法
【发布时间】:2020-12-26 21:25:13
【问题描述】:

有没有一种简单的方法可以在 c++ 中获取所有打开的命名管道,就像在 c# 中一样?

String[] listOfPipes = System.IO.Directory.GetFiles(@"\\.\pipe\");

我发现了这个article,其中提出了不同的方法来获取所有开放的命名管道,不幸的是,对于 c++ c0x 没有。

【问题讨论】:

  • 只要您在 Windows 上,完全相同的代码可以在 C++ 中运行。只需使用 C++ 函数进行目录列表。
  • C++0x?甚至没有 C++11?为此,您需要 C++17。
  • 检查 MS docs 以获得适当的 API
  • 主要思想 - 命名管道不是 c++ 功能,而是特定于 windows 的 api。它已经过时了,我认为并没有像 c# 那样有任何改进。因此,您可能应该使用我上面链接的文档中的 api 自己构建类似的东西
  • @MSalters 当然你不需要需要 C++17。 OP 正在为 Windows 编写代码。 WinAPI 完全够用。

标签: c++ windows named-pipes


【解决方案1】:

由于您不能使用 C++17,因此您需要 WinAPI 迭代目录的方式。那是FindFirstFile / FindNextFile。尽管有这个名字,但如果你查看\\.\pipe\,它也会找到管道。

【讨论】:

  • 应该是预料之中的。命名管道文件系统 (NPFS) 的根目录位于 "\\Device\\NamedPipe\\"(即 "\\\\.\\PIPE\\"),其中包含命名管道文件并支持目录查询,例如 FileDirectoryInformation。有趣的是,NPFS 不支持子目录,因此名称中允许使用斜杠。此外,在目录条目中,分配大小是实例的最大数量,大小是当前数量。但在管道实例的标准信息中,分配大小是以字节为单位的总配额,大小是在查询管道端排队的字节数。
【解决方案2】:

.NET 的大部分源代码在 https://referencesource.microsoft.com 上公开提供。

如果您查看 System.IO.Directory 类的 source code,它的 GetFiles() 方法会使用来自 FileSystemEnumerableFactory.CreateFileNameIterator()IEnumerable<String> 创建一个 TList<String>,然后将该 TList<String> 转换为 String[]数组,其中FileSystemEnumerableIterator 在内部使用 Win32 API FindFirstFile()FindNextFile() 函数。

所以,声明:

String[] listOfPipes = System.IO.Directory.GetFiles(@"\\.\pipe\");

大致相当于以下直接使用 Win32 API 的 C++ 代码:

#include <windows.h>
#include <string>
#include <vector>

std::vector<std::wstring> listOfPipes;

std::wstring prefix(L"\\\\.\\pipe\\");

WIN32_FIND_DATAW fd;
HANDLE hFind = FindFirstFileW((prefix + L"*").c_str(), &fd);
if (hFind == INVALID_HANDLE_VALUE)
{
    // error handling...
}
else
{
    do
    {
        listOfPipes.push_back(prefix + fd.cFileName);
    }
    while (FindNextFileW(hFind, &fd));

    // error handling...

    FindClose(hFind);
}

【讨论】:

  • 谢谢,这正是我想要的!
猜你喜欢
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
  • 2012-07-11
  • 1970-01-01
相关资源
最近更新 更多