如何在网络Ts中使用超时运行轮询

时间:2019-04-03 12:30:53

标签: c++ networking boost-asio

我有一个ip :: tcp :: acceptor套接字,我想轮询并检查它是否已准备好接受,而不是阻止并调用接受,但是我想在超时的情况下这样做。

class constructor

1 个答案:

答案 0 :(得分:1)

首先,对poll_one的调用没有执行任何操作..没有等待它立即返回的异步工作。

上面的代码将在“ accept”调用上“阻塞”,直到您接受新的套接字为止。

在这种情况下,无法(据我所知)进行超时。如果要超时控制,此时必须使用异步方法。

例如(使用boost asio)

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

using namespace std::chrono_literals;

int main()
{
    const unsigned short port_num = 100;
    boost::asio::io_context ioc;
    auto endpoint = boost::asio::ip::basic_endpoint<boost::asio::ip::tcp>(boost::asio::ip::address_v4::loopback(), port_num);
    auto acceptor = boost::asio::ip::tcp::acceptor(ioc, boost::asio::ip::tcp::v4());
    auto timer = boost::asio::system_timer(ioc);

    acceptor.bind(endpoint);
    acceptor.listen();

    timer.expires_from_now(10s);
    timer.async_wait([&acceptor](auto const& ec)
        {
            if (!ec)
            {
                std::cout << "timed out";
                boost::system::error_code cec;
                acceptor.cancel(cec);
            }
        });

    acceptor.async_accept([&timer](auto const& ec, auto tcp_socket)
        {
            if(!ec)
            {
                std::cout << "socket accepted";
                boost::system::error_code cec;
                timer.cancel(cec);
                tcp_socket.shutdown(boost::asio::socket_base::shutdown_both);
            }
        });

    ioc.run();
    return EXIT_SUCCESS;
}