TransWikia.com

Помогите разобраться с поддержкой корутин в boost Asio

Stack Overflow на русском Asked by Denver Toha on December 21, 2020

Есть следующий код, он просто принимает сообщение из сокета и печатает его в консоль.

#include <iostream>
#include <string>
#include <boost/asio.hpp>
#include <functional>

boost::asio::io_context context;
using boost::asio::ip::tcp;
const uint16_t port = 8000;
tcp::acceptor acceptor(context, tcp::endpoint(tcp::v6(), port));


void accept();
void out(std::shared_ptr<std::string> buff){
    std::cout << *buff;
    accept();
}

void do_read(std::shared_ptr<tcp::socket> session){
    std::shared_ptr<std::string> buff(new std::string);
    buff->resize(3000);
    session->async_receive(boost::asio::buffer(*buff, 3000), std::bind(out, buff));
    std::string rest = *buff;
    session->close();
}

void accept(){
    std::shared_ptr<tcp::socket> session(new tcp::socket(context));
    auto handler = std::bind(do_read, session);
    acceptor.async_accept(*session, handler);
}

int main(){

    accept();
    context.run();
    return 0;
}

Код очень маленький и простенький, но тем не менее получается лапша из колбеков. Насколько мне известно, начиная с boost 1.70 в boost Asio включена поддержка coroutine TS. Как можно переписать этот код используя корутины в виде бесконченого цикла??

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP