| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Сети > boost::asio & async_connect |
| Автор: Kirgston 4.9.2011, 20:24 | ||||
| Всем доброго времени суток! Дело такое... есть класс(клиент) который должен асинхронно работать с сервером. Проблема очень странного характера. Есть:
Всё это члены класса wsJoinServerCli. Забавно то что оно работает так сказать через раз. Точнее через неделю. Одну неделю я компилирую код и всё хорошо. На сл. неделю (это всё конечно утрировано и примерно) тот же код без йоты изменений уже не работает. Как только я делаю:
Сразу всё начинает работать. А в первом варианте handle_connect попросту не вызывается. Никаких ошибок, никаких проблем. Она просто не вызывается. Вот и сижу уже битые часа 4 и понять не могу. Облазил примеры с буста там примерно всё так же. В чем ошибка понять не могу. А ведь хочется чтобы работал полностью асинхронно =) а не то что в одном месте мы синхронные в другом асинхронны. Так же еще один вопрос из разряда "глупости". Интересует как правильно(!) отправлять данные в асинхронном р-ме. А точнее: есть например структура, тут понятно, её просто пакуем в shared_pointer и кидаем в async_send(). А что если не структура? А просто массив еще и неизвестной длинны? Сколотить из него структуру я явно не могу. Длинна узнается прямо перед отправкой. Как тут быть? |
| Автор: mabrarov 4.9.2011, 22:11 |
| Непонятно, как (кто, когда, чем) в первом варианте заполняется this->endpoint? Действительно ли там всегда содержится что-то вменяемое на момент вызова async_connect? Все это сильно зависит от остального кода. |
| Автор: Kirgston 4.9.2011, 22:30 |
Так же как и во втором варианте =) просто у меня код один, вот и чтобы не выкладывать код с закоментироваными строчками я его чистил. Вот и случайно удалил эндпоинт. В реальном случае он вменяемо заполняется. Абсолютно теми же данными. Причем в первом случае не просто каллбэка нету а и вообще коннекта. |
| Автор: Kirgston 4.9.2011, 22:43 | ||||
да, именно. Как будто вникуда идет socket_.async_connect(). Само собой кода ошибки не имею Угу. Через shared_pointer. Например вот так вот:
Не помню кто и где , но мне подсказали что так будет нормально. И указатель со структурой сами удалятся после использования Буст асио он ведь не риал тайм(если не ошибаюсь). И если я создаю локальный(!) буфер в котором формирую список данных и передаю этот буфер в async_send(). Отправка данных понятное дело не моментальная, может отправится через 0.1с а может и через 1с. Но после выхода из блока этот статический буфер само собой уничтожится. В итоге асио попытается отправить те данные которых уже нету, либо на ихнем адресе лежат уже другие данные |
| Автор: boostcoder 4.9.2011, 23:07 |
компилятор/ОС/версия_boost ? |
| Автор: mabrarov 4.9.2011, 23:23 | ||
Надо проверить:
|
| Автор: Kirgston 4.9.2011, 23:40 |
MSVC 2010 Sp1 boost 1.47 XP Sp3 |
| Автор: Kirgston 5.9.2011, 08:45 | ||
![]() Забавно вот что... может я и не на то смотрю. Но тем не менее. Когда делаю:
Эндпоинт отлично заполняется. Но обратите внимание на то как он заполняется когда я вызываю connect(). Эндпоинт попросту не заполнен ![]() Так же чуток забавно с async_connect. State у них разные. Я уже даже не понимаю куда копать :( |
| Автор: boostcoder 5.9.2011, 14:22 |
| такое предположение: если при использовании connect(), у тебя все работает, потому что каждый раз при его вызове ты заново инициализируешь endpoint, значит, в противном случае, значение endpoint`а который ты используешь для async_connect() чем-то затирается. попробуй перед каждым async_connect() инициализировать endpoint. |
| Автор: Kirgston 5.9.2011, 14:26 | ||||||
Так вот же на втором скрине видно что он инициализируется перед async_connect(). Что
Что
Разницы нету |
| Автор: boostcoder 5.9.2011, 14:38 |
| показывай больше кода. а лучше компилябельный код воспроизводящий проблему. Добавлено через 48 секунд может то, куда ты коннектишься, тупо висит? |
| Автор: mabrarov 5.9.2011, 14:45 |
Еще раз повторю:
|
| Автор: boostcoder 5.9.2011, 15:03 | ||
я подумал что ТС в курсе что сервер не должен обрывать соединение ;) |
| Автор: mabrarov 5.9.2011, 15:21 | ||||
Все в курсе. Все (полностью) читали документацию. И все начинают оптимизировать (или просто боятся мифических циклических ссылок) и выкидывают enable_shared_from_this. Наболело. Если не лень - подсчитайте, сколько было аналогичных вопросов в списке рассылки по Asio. Да, можно обойтись без enable_shared_from_this. Но надо читать доки, где четко описаны требования к времени жизни всех компонент, входящих в асинхронную операцию. Надеюсь, я не прав и тут действительно баг в Asio. Без обид. Действительно буду рад найти и излечить баг (в Asio) раньше, чем он испортит жизнь лично мне. |
| Автор: boostcoder 5.9.2011, 15:33 |
это страшно.. |
| Автор: mabrarov 5.9.2011, 17:21 | ||
Типичный пример premature optimization. Реально Яндекс вот юзает io_service-per-thread (дабы данные "парковались" в пределах кэша соотв. ядра CPU) - не удивлюсь, если они не юзают shared_from_this дабы избежать лишних барьеров памяти. На BoostCon 2011 Chris рассказывал, что можно и без enable_shared_from_this - вот только никто разницу никогда не считал и не приводил диаграмм, а вот "общий уровень опасности" это здорово увеличивает. |
| Автор: boostcoder 5.9.2011, 17:41 |
я в каком-то OpenSource проекте такое видал. удивился... |
| Автор: Kirgston 5.9.2011, 18:12 |
| В последсвии очень странных ошибок(МССКЛ начал отваливатся на валидных кусках кода, когда я заходил через менеджер и подключался там, а после просто закрывал ничего при этом не делая - всё сразу становилось норм) которых я за 2 дня нахапал столько сколько не ловил целое лето... решил попросту формат Ц, и поставить винду 7 (сейчас ХР). Думаю уже к вечеру попробую всё перекомпилить. Может поможет |