Я пишу приложение UDP-сервера с Boost, которое должно прослушивать сокет в течение 5 секунд, и если в течение этих 5 секунд не было получено дейтаграмм, перейдите к выполнению другие вещи.std :: future не работает в режиме приема буфера UDP-асинхронного приема
Вдохновленный some answers Я решил попробовать решение на основе std :: future.
Проблема в том, что вызов wait_for()
всегда истекает так, как если бы данные не были получены. Но если я устанавливаю точку останова на строке, которая выполняется после таймаута, и что я проверяю переменные, я вижу, что буфер содержит полученную датаграмму, а объект remote_endpoint
содержит адрес клиента. Другими словами, прием сокетов работает так, как ожидалось, но std :: future не срабатывает. Зачем?
Вот мой тестовый код сервера:
#include <future>
#include <boost/asio.hpp>
#include <boost/asio/use_future.hpp>
using boost::asio::ip::udp;
int main()
{
try
{
boost::asio::io_service io_service;
udp::socket socket(io_service, udp::endpoint(udp::v4(), 10000));
char recv_buf[8];
for (;;)
{
ZeroMemory(recv_buf, 8);
udp::endpoint remote_endpoint;
std::future<std::size_t> recv_length;
recv_length = socket.async_receive_from(
boost::asio::buffer(recv_buf),
remote_endpoint,
0,
boost::asio::use_future);
if (recv_length.wait_for(
std::chrono::seconds(5)) == std::future_status::timeout)
{
printf("time out. Nothing received.\n");
}
else
{
printf("received something: %s\n", recv_buf);
}
}
}
catch (std::exception& e)
{
printf("Error: %s\n", e.what());
}
return 0;
}
Я стучал голову на этом некоторое время, так что любая помощь будет оценена. Я нахожусь в Windows 10 с Visual Studio 2015.
Вот мой тестовый клиентский код (в python, извините).
import socket
import time
HOST = "server" # The remote host
PORT = 10000 # The same port as used by the server
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
address = socket.getaddrinfo(HOST, PORT)[0][-1]
while True:
s.sendto("ping\0", address)
time.sleep(1)
Связанный вопрос и ответ, требующий запуска 'io_service':", поскольку вызывающий поток будет заблокирован в ожидании будущего, по крайней мере один другой поток должен обрабатывать 'io_service', чтобы разрешить асинхронный [... ] для прогресса и выполнения обещания ». –