gpt4 book ai didi

c++ - 如何在网络 Ts 中超时运行轮询

转载 作者:行者123 更新时间:2023-11-28 04:20:44 27 4
gpt4 key购买 nike

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

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 的调用没有做任何事情。没有等待它立即返回的异步工作。

以上代码将“阻塞”“接受”调用,直到您接受一个新的套接字。

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

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

关于c++ - 如何在网络 Ts 中超时运行轮询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55495266/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com