【发布时间】:2020-08-25 23:34:03
【问题描述】:
我正在考虑使用第三方库在Windows 上使用named pipes 进行IPC 通信。在过去的几年里,我一直在使用Win32API。我有兴趣用一个久经考验的真正开源库替换我的实现。
我注意到boost::process 有一个async_pipe 的实现,它允许我将它与boost::asio 一起使用,这对我的应用程序非常有帮助。
我要做的是在服务器上创建named pipe,这是一个C# 应用程序。
创建pipe 后,使用boost::process::async_pipe 与客户端连接。
我遇到的问题是我在boost::process 中没有看到允许我连接到已经创建的named pipe 的API。 constructors 为 async_pipe 创建 pipe 而不是连接到已创建的 pipe。
下面是我当前在客户端中使用的代码,它错误地创建了pipe
boost::asio::io_context ctx;
std::vector<char> buffer( 8196, 0 );
boost::process::async_pipe pipe{ ctx, R"(\\.\pipe\TestPipe)" };
boost::asio::async_read( pipe, boost::asio::buffer( buffer ),
[ &buffer ]( const boost::system::error_code& ec, std::size_t size )
{
if ( ec )
std::cout << "Error: " << ec.message( ) << '\n';
else
{
std::string message{ std::begin( buffer ), std::begin( buffer ) + size };
std::cout << "Received message: " << message << '\n';
}
} );
ctx.run( );
我不确定是否可以使用boost::process 来实现我想要的。我想知道是否有一种方法可以使用CreateFileW 与named pipe 连接,然后将HANDLE 传递给async_pipe,但我还没有找到任何相关文档。
问题
如何使用boost 连接已创建的named pipe
【问题讨论】:
-
要连接到已经创建的命名管道,您只需调用
CreateFileW。async_pipe是做什么的,对于异步 i/o 来说,它到底是怎么回事?