Windows extension for boost-asio. Header only. Alpha, WIP.
boost::winasio::named_pipe_acceptor
is a drop in replacement for boost::asio::basic_socket_acceptor
.
boost::winasio::named_pipe
is a drop in replacement for boost::asio::basic_stream_socket
.
One build a named_pipe server and client with all asio socket functionalities.
Counter part in other languages:
- Golang
github.com/Microsoft/go-winio
DialPipe - Rust tokio tokio::net::windows::named_pipe
Coroutine Example Snippet:
winnet::named_pipe_protocol<net::any_io_executor>::endpoint ep(
"\\\\.\\pipe\\mynamedpipe");
winnet::named_pipe_protocol<net::any_io_executor>::acceptor acceptor(executor,
ep);
for (;;) {
winnet::named_pipe_protocol<net::any_io_executor>::pipe socket =
co_await acceptor.async_accept(use_awaitable);
std::cout << "listener spawing" << std::endl;
co_spawn(executor, echo(std::move(socket)), detached);
}
See examples for full code.
Utilize asio overlapped io intergration with executors. Provide asio style wrapper for async operation with http.sys.
Provide asio style wrapper for Winhttp running in async mode. All winhttp apis are converted to async version, compatible with both coroutine and callback styles.
Coroutine Example Snippet:
co_await h_request.async_send(NULL, // headers
0, // header len
WINHTTP_NO_REQUEST_DATA, // optional
0, // optional len
0, // total len
net::use_awaitable);
std::vector<BYTE> body_buff;
auto dybuff = net::dynamic_buffer(body_buff);
co_await h_request.async_recieve_response(net::use_awaitable);
std::size_t len = 0;
do {
len =
co_await h_request.async_query_data_available(net::use_awaitable);
auto buff = dybuff.prepare(len + 1);
std::size_t read_len = co_await h_request.async_read_data(
(LPVOID)buff.data(), static_cast<DWORD>(len), net::use_awaitable);
BOOST_REQUIRE_EQUAL(read_len, len);
dybuff.commit(len);
} while (len > 0);
See Example Test for full code.
See Internals.md for implmentation details.
asio/boost-asio Install as part of boost: boost windows install
Boost Software License - Version 1.0