LINUX.ORG.RU

C++ Asio под Windows

 , ,


0

2

Пытаюсь сделать простой tcp клиент с использованием этой библиотеки. Задействовал таймер asio::steady_timer, использую его асинхронно. Проблема в том, что в момент вызова его конструктора (в который передается asio::io_service&) бросается исключение с кодом 10045 WSAEOPNOTSUPP. Пробовал при сборке передать дефайн ASIO_DISABLE_IOCP. Падать перестал, но работает как-то странно. Вызывается колбэк с ошибкой: 995 ERROR_OPERATION_ABORTED.

Использую MinGW 4.9.3. Передаю дефайны: _WIN32 _WIN32_WINNT=0x0601 ASIO_STANDALONE ASIO_DISABLE_IOCP.

asio::steady_timer m_deadline;

void AsyncTcpClient::setTimer()
{
using namespace std::placeholders;

	m_deadline.expires_from_now(std::chrono::milliseconds(m_timeout) );
	m_deadline.async_wait([this](const asio::error_code& e){ timeout_callback(e); });
}

void AsyncTcpClient::timeout_callback(const asio::error_code& e)
{
	std::string m = e.message();
	if (!e)
	{
		m_socket.cancel();
	}
	else
	{
		failed("Timer failed");
	}
}

В чем может быть проблема?


ERROR_OPERATION_ABORTED

Не в курсе, как в Windows, но в Linux это нормальное поведение. Почти любой вызов с ожиданием может проснуться раньше, чем положено. Эту ситуацию нужно обрабатывать.

i-rinat ★★★★★
()
Ответ на: комментарий от Gvidon

Библиотека кроссплатформенная, если что...

silart
() автор топика
Ответ на: комментарий от silart

Нет, не могу. Могу только посоветовать подцепиться отладчиком и посмотреть, откуда прилетает operation_aborted.

i-rinat ★★★★★
()

У меня UTR

mingw 5.3

anonymous
()

Согласен с одним из ответов выше. Посмотри, как реализован таймаут в пнимерах их оф. документации.

rumgot ★★★★★
()
Ответ на: комментарий от asaw

Дело в том, что я использую standalone, то есть отдельную библиотеку Asio без boost, и в ней нет boost::asio::deadline_timer. Там используется asio::steady_timer, который основан на std::chrono. Таймер boost::asio::deadline_timer у меня прекрасно работал несколько лет назад, когда я использовал boost::asio. Вот я пока не могу понять почему вылетают исключения под windows.

silart
() автор топика
Ответ на: комментарий от anonymous

и чем мотивирован отказ от qt ?

ваш же вопрос был?

silart
() автор топика
Ответ на: комментарий от silart

Возьми последний асио, если их примеры не работают - накатай баг, или поищи похожий баг. Мож уже починили.

anonymous
()
Ответ на: комментарий от anonymous

проблема решена передачей дефайна ASIO_HAS_THREADS. Таймер заработал.

Еще заметил очень опасный баг: asio.hpp нужно всегда включать перед windows.h (и другими хидерами, которые его включают).

здесь

Иначе возникает segmentation fault в дебрях asio. Это очень не очевидно и опасно. Может кому пригодится.

silart
() автор топика
Ответ на: комментарий от x905

просто интересно почему было отдано предпочтение asio в разработке программы

Asio более гибкая и более специализированная библиотека для работы с сетями, чем та часть Qt, которая отвечает за сети. К тому же не придется тащить тяжелую Qt туда, где она не нужна, например в консольное приложение. На основе Asio есть хорошие библиотеки HTTP, например Restbed. Я ей пользовался, очень удобно и красиво.

silart
() автор топика
Ответ на: комментарий от silart

Asio более гибкая и более специализированная библиотека для работы с сетями, чем та часть Qt, которая отвечает за сети.

можно ли конкретнее ?

x905 ★★★★★
()
Ответ на: комментарий от x905

Qt - это прежде всего гуй. То что сбоку прилепили, имхо, лишнее. Asio создана для работы с сетями, последовательными портами, и даже файлами (правда я не пробовал). Asio позволяет делать многопоточный асинхронный ввод-вывод, получается красиво.

Если у тебя в проекте плотно используется Qt, при этом нужно сделать что-то простое (с сетью), и нет желания тянуть дополнительные либы, используй Qt.

silart
() автор топика
Ответ на: комментарий от silart

Asio позволяет делать многопоточный асинхронный ввод-вывод, получается красиво.

Без обид, но «asio» и «красиво» — это антонимы. Ходят слухи про связку из asio+coroutines, но я вживую такого не видел.

kawaii_neko ★★★★
()
Ответ на: комментарий от silart

Спасибо Тебе! Пол дня сегодня провозился с этим. Под линукс таймер работает, а под виндой выбрасывает исключение в конструкторе. Кстати, а где ты нашёл, что нужно ASIO_HAS_THREADS для windows указывать?

zzz-13-zzz
()
Ответ на: комментарий от silart

Qt - это прежде всего гуй.

на чем основан этот вывод ?

и всеже - чем asio более гибче при работе с сетями чем qt ?

x905 ★★★★★
()
Ответ на: комментарий от zzz-13-zzz

Спасибо Тебе! Пол дня сегодня провозился с этим. Под линукс таймер работает, а под виндой выбрасывает исключение в конструкторе. Кстати, а где ты нашёл, что нужно ASIO_HAS_THREADS для windows указывать?

Методом научного тыка и курением исходников. :-)

silart
() автор топика
Ответ на: комментарий от x905

на чем основан этот вывод

Понимаешь, я мало работал с Qt Network, и я не готов так огульно критиковать Qt. Однако сам факт того, что она очень тяжела и требует сборки будет минусом, если нужно сделать простую программу без гуя.

Скажи мне, а есть ли на основе Qt какие-нибудь библиотеки для HTTP? Можно ли быстро веб-сервер сделать?

silart
() автор топика
Ответ на: комментарий от silart

кто сборки требует ?

в исходном сообщении не было упоминания http сервера, а только «простой tcp клиент»

если надо «быстро» веб сервер сделать, то лучше взять готовый, он всяко лучше будет чем самому писать

x905 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.