我有一个ip :: tcp :: acceptor套接字,我想轮询并检查它是否已准备好接受,而不是阻止并调用接受,但是我想在超时的情况下这样做。
class constructor
答案 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;
}