Увеличить тайм-аут asio
Возможный дубликат:
Как установить таймаут на блокировку сокетов в boost asio?
Я прочитал некоторые записи о тайм-ауте, но я не понимаю.
Я хочу определенный тайм-аут для соединения. код подключения выглядит так:
try{
boost::asio::ip::tcp::resolver resolver(m_ioService);
boost::asio::ip::tcp::resolver::query query(link.get_host(), link.get_scheme());
boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
boost::asio::ip::tcp::resolver::iterator end;
boost::system::error_code error = boost::asio::error::host_not_found;
while (error && endpoint_iterator != end)
{
m_socket.close();
m_socket.connect(*endpoint_iterator++, error);
}
}
также я хочу тайм-аут чтения.
я использую boost::asio::read_until(m_socket, response, "\r\n");
для чтения в шапке.
Можно ли установить ПРОСТОЙ тайм-аут?
2 ответа
Во-первых, я считаю, что вы ВСЕГДА должны использовать асинхронные методы, так как они лучше, и ваша конструкция выиграет только от подхода с использованием реактора. В плохом случае, когда вы спешите и создаете прототип, методы синхронизации могут быть полезны. В этом случае я согласен с вами, что без поддержки тайм-аута они не могут быть использованы в реальном мире.
То, что я сделал, было очень просто:
void HttpClientImpl::configureSocketTimeouts(boost::asio::ip::tcp::socket& socket)
{
#if defined OS_WINDOWS
int32_t timeout = 15000;
setsockopt(socket.native(), SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof(timeout));
setsockopt(socket.native(), SOL_SOCKET, SO_SNDTIMEO, (const char*)&timeout, sizeof(timeout));
#else
struct timeval tv;
tv.tv_sec = 15;
tv.tv_usec = 0;
setsockopt(socket.native(), SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
setsockopt(socket.native(), SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv));
#endif
}
Приведенный выше код работает как в Windows, так и в Linux, а также в MAC OS, в соответствии с макросом OS_WINDOWS.
Использование boost::asio и синхронные вызовы, такие как read_until, не позволяют легко установить время ожидания.
Я бы предложил перейти к асинхронным вызовам (например, async_read) и объединить их с deadline_timer для достижения этой цели.