如何在网络 T 中运行超时的轮询



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

net::io_context ioc;
auto endpoint = ip::basic_endpoint<ip::tcp> 
 (ip::address_v4::loopback(), port_num);
auto socket = ip::tcp::acceptor(ioc, ip::tcp::v4());
std::error_code ec;
socket.bind(endpoint);
socket.listen();
auto ct = ioc.poll_one();
auto tcp_socket = socket.accept();

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

上面的代码将"阻止"接受"调用,直到您接受新的套接字。

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

例如(使用升压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;
}

最新更新