boost::asio::spawn 將一統(tǒng)C++網(wǎng)絡庫
(金慶的專欄)
boost::asio::spawn()創(chuàng)建一個協(xié)程,使C++網(wǎng)絡編程大大簡化,
個人認為這使得 asio 成為C++首選網(wǎng)絡庫。
boost::asio::spawn(my_strand, do_echo);
一般輸入2個參數(shù),參數(shù)1是 io_service 或者是 strand,
參數(shù)2是協(xié)程函數(shù),類型如下:
void coroutine(boost::asio::yield_context yield);
在協(xié)程函數(shù)中調用各個異步IO,異步操作將掛起協(xié)程,待異步操作完成后會自動繼續(xù)協(xié)程。
示例:
// See: doc/html/boost_asio/example/cpp11/spawn/echo_server.cpp
try
{
boost::asio::io_service io_service;
using std::placeholders::_1;
using std::ref;
boost::asio::spawn(io_service,
std::bind(LoopAccept, ref(io_service), unPort, _1));
io_service.run();
}
catch (std::exception& e)
{
std::cerr << "Exception: " << e.what() << "\n";
}
// Accept coroutine.
static void LoopAccept(boost::asio::io_service& io_service,
unsigned short port, boost::asio::yield_context yield)
{
using boost::asio::ip::tcp;
tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), port));
for (;;)
{
boost::system::error_code ec;
std::shared_ptr<CAsioSvrSession> pSession(
new CAsioSvrSession(io_service));
acceptor.async_accept(pSession->GetSocket(), yield[ec]);
if (ec) continue;
pSession->Go(); // Will spawn read and write coroutine.
}
}
(金慶的專欄)
boost::asio::spawn()創(chuàng)建一個協(xié)程,使C++網(wǎng)絡編程大大簡化,
個人認為這使得 asio 成為C++首選網(wǎng)絡庫。
boost::asio::spawn(my_strand, do_echo);
一般輸入2個參數(shù),參數(shù)1是 io_service 或者是 strand,
參數(shù)2是協(xié)程函數(shù),類型如下:
void coroutine(boost::asio::yield_context yield);
在協(xié)程函數(shù)中調用各個異步IO,異步操作將掛起協(xié)程,待異步操作完成后會自動繼續(xù)協(xié)程。
示例:
// See: doc/html/boost_asio/example/cpp11/spawn/echo_server.cpp
try
{
boost::asio::io_service io_service;
using std::placeholders::_1;
using std::ref;
boost::asio::spawn(io_service,
std::bind(LoopAccept, ref(io_service), unPort, _1));
io_service.run();
}
catch (std::exception& e)
{
std::cerr << "Exception: " << e.what() << "\n";
}
LoopAccept() 是實際的協(xié)程函數(shù)
// Accept coroutine.
static void LoopAccept(boost::asio::io_service& io_service,
unsigned short port, boost::asio::yield_context yield)
{
using boost::asio::ip::tcp;
tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), port));
for (;;)
{
boost::system::error_code ec;
std::shared_ptr<CAsioSvrSession> pSession(
new CAsioSvrSession(io_service));
acceptor.async_accept(pSession->GetSocket(), yield[ec]);
if (ec) continue;
pSession->Go(); // Will spawn read and write coroutine.
}
}