我有一个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;
}