簡體   English   中英

通過 boost 連接已創建的名為 pipe

[英]Connect with an already created named pipe with boost

我正在尋找使用第三方庫在Windows上使用named pipes進行 IPC 通信。 在過去的幾年里,我一直在使用Win32 API 我有興趣用一個久經考驗的真正開源庫來替換我的實現。

我注意到boost::process有一個async_pipe的實現,它允許我將它與boost::asio一起使用,這對我的應用程序非常有幫助。

我要做的是在服務器上創建named pipeC#應用程序。 創建pipe后,使用boost::process::async_pipe與客戶端連接。

我遇到的問題是我在boost::process中看不到 API ,這將允許我連接已創建的named pipe async_pipeconstructors函數創建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來實現我想要的。 我想知道是否有一種方法可以使用CreateFileWnamed pipe連接,然后將HANDLE傳遞給async_pipe但我還沒有找到任何相關文檔。

問題

如何使用boost連接已創建的named pipe

好的,所以我走錯了路。 在 Github Link上閱讀此問題后,我意識到我需要改用stream_handle 請注意, pipe必須在OVERLAPPED模式下打開才能正常工作。

創建stream_handle

static boost::asio::windows::stream_handle OpenPipe( io_context& context )
{
    constexpr const wchar_t* pipeName{ LR"(\\.\pipe\TestPipe)" };
    return { context, CreateFileW( pipeName,
                                   GENERIC_READ | GENERIC_WRITE,
                                   0, nullptr,
                                   OPEN_EXISTING,
                                   FILE_FLAG_OVERLAPPED,
                                   nullptr ) };
}

創建stream_handle ,您可以使用它提供的async函數進行通信。

使用stream_handle

std::vector<char> buffer( 8196, 0 );
pipe.async_read_some( boost::asio::buffer( buffer ), 
    [ &buffer ]( auto ec, auto size ) { } );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM