c++ 异步接受不调用处理程序

eqfvzcg8  于 2023-05-08  发布在  其他
关注(0)|答案(1)|浏览(164)

我尝试做一个简单的套接字服务器,使用boost服务器处理多个客户端。但是我遇到了一个问题,async_accept函数的处理程序没有调用我指定的处理程序。这可能是一个简单的修复方法,但我还不太习惯Boost框架。

#include <boost/asio.hpp>
    #include <boost/thread/thread.hpp>
    #include <iostream>

    using namespace boost::asio;
    using ip::tcp;
    using std::cout;
    using std::endl;
    using std::string;
    void accept_handler(const boost::system::error_code& error) {
    if (!error) {
    std::cout << "Success";
    } else {
    std::cout << "Failed";
      
    }
    }

    void server(int port) {
    boost::asio::io_service io_service;
    // listen for new connection
    tcp::acceptor acceptor_(io_service, tcp::endpoint(tcp::v4(), port));
    std::cout << "Listening for Connection\n";
    // socket creation
    tcp::socket socket_(io_service);
    // waiting for the connection
    std::cout << "Waiting for Clients\n";
    acceptor_.async_accept(socket_, accept_handler);
}

我尝试的事情是查看boost框架的文档,其中说
此函数用于要求io_service执行给定的处理程序,但不允许io_service从此函数内部调用处理程序。
总而言之,async_accept函数会自动调用处理程序。所以我想弄清楚如何自动调用这个函数。

q3qa4bjr

q3qa4bjr1#

你有一个异步操作,但没有运行你的io服务。最简单的解决方法是立即添加它:

void server(int port) {
    asio::io_service io_service;
    // listen for new connection
    tcp::acceptor acceptor_(io_service, tcp::endpoint(tcp::v4(), port));
    std::cout << "Listening for Connection\n";
    // socket creation
    tcp::socket socket_(io_service);
    // waiting for the connection
    std::cout << "Waiting for Clients\n";
    acceptor_.async_accept(socket_, accept_handler);

    io_service.run();
}

请记住,除非accept_handler发布更多的异步工作,否则服务将完成,您需要restart来执行新的工作。

相关问题