![]() |
|
Модераторы: feodorv |
![]()
|
|
| Kirgston |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 792 Регистрация: 24.12.2007 Репутация: нет Всего: 2 |
Всем доброго времени суток! Дело такое... есть класс(клиент) который должен асинхронно работать с сервером. Проблема очень странного характера.
Есть:
Всё это члены класса wsJoinServerCli. Забавно то что оно работает так сказать через раз. Точнее через неделю. Одну неделю я компилирую код и всё хорошо. На сл. неделю (это всё конечно утрировано и примерно) тот же код без йоты изменений уже не работает. Как только я делаю:
Сразу всё начинает работать. А в первом варианте handle_connect попросту не вызывается. Никаких ошибок, никаких проблем. Она просто не вызывается. Вот и сижу уже битые часа 4 и понять не могу. Облазил примеры с буста там примерно всё так же. В чем ошибка понять не могу. А ведь хочется чтобы работал полностью асинхронно =) а не то что в одном месте мы синхронные в другом асинхронны. Так же еще один вопрос из разряда "глупости". Интересует как правильно(!) отправлять данные в асинхронном р-ме. А точнее: есть например структура, тут понятно, её просто пакуем в shared_pointer и кидаем в async_send(). А что если не структура? А просто массив еще и неизвестной длинны? Сколотить из него структуру я явно не могу. Длинна узнается прямо перед отправкой. Как тут быть? |
||||
|
|||||
| mabrarov |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 100 Регистрация: 12.1.2011 Где: Казань Репутация: нет Всего: 9 |
Непонятно, как (кто, когда, чем) в первом варианте заполняется this->endpoint? Действительно ли там всегда содержится что-то вменяемое на момент вызова async_connect? Все это сильно зависит от остального кода.
|
|||
|
||||
| Kirgston |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 792 Регистрация: 24.12.2007 Репутация: нет Всего: 2 |
Так же как и во втором варианте =) просто у меня код один, вот и чтобы не выкладывать код с закоментироваными строчками я его чистил. Вот и случайно удалил эндпоинт. В реальном случае он вменяемо заполняется. Абсолютно теми же данными. Причем в первом случае не просто каллбэка нету а и вообще коннекта. |
|||
|
||||
| boostcoder |
|
||||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 13 Всего: 110 |
т.е. ты хочешь сказать, что мало того что коннекта не происходит, так еще и хендлер не вызывается? а если вызывается, то error_code чему равен?
без сериализации?
поясните... |
||||||
|
|||||||
| Kirgston |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 792 Регистрация: 24.12.2007 Репутация: нет Всего: 2 |
да, именно. Как будто вникуда идет socket_.async_connect(). Само собой кода ошибки не имею Угу. Через shared_pointer. Например вот так вот:
Не помню кто и где , но мне подсказали что так будет нормально. И указатель со структурой сами удалятся после использования Буст асио он ведь не риал тайм(если не ошибаюсь). И если я создаю локальный(!) буфер в котором формирую список данных и передаю этот буфер в async_send(). Отправка данных понятное дело не моментальная, может отправится через 0.1с а может и через 1с. Но после выхода из блока этот статический буфер само собой уничтожится. В итоге асио попытается отправить те данные которых уже нету, либо на ихнем адресе лежат уже другие данные Это сообщение отредактировал(а) Kirgston - 4.9.2011, 22:45 |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 13 Всего: 110 |
компилятор/ОС/версия_boost ? |
|||
|
||||
| mabrarov |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 100 Регистрация: 12.1.2011 Где: Казань Репутация: нет Всего: 9 |
Надо проверить:
|
|||
|
||||
| Kirgston |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 792 Регистрация: 24.12.2007 Репутация: нет Всего: 2 |
||||
|
||||
| Kirgston |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 792 Регистрация: 24.12.2007 Репутация: нет Всего: 2 |
![]() Забавно вот что... может я и не на то смотрю. Но тем не менее. Когда делаю:
Эндпоинт отлично заполняется. Но обратите внимание на то как он заполняется когда я вызываю connect(). Эндпоинт попросту не заполнен ![]() Так же чуток забавно с async_connect. State у них разные. Я уже даже не понимаю куда копать :( Это сообщение отредактировал(а) Kirgston - 5.9.2011, 08:52 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 13 Всего: 110 |
такое предположение: если при использовании connect(), у тебя все работает, потому что каждый раз при его вызове ты заново инициализируешь endpoint, значит, в противном случае, значение endpoint`а который ты используешь для async_connect() чем-то затирается.
попробуй перед каждым async_connect() инициализировать endpoint. |
|||
|
||||
| Kirgston |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 792 Регистрация: 24.12.2007 Репутация: нет Всего: 2 |
Так вот же на втором скрине видно что он инициализируется перед async_connect(). Что
Что
Разницы нету |
||||||
|
|||||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 13 Всего: 110 |
показывай больше кода. а лучше компилябельный код воспроизводящий проблему.
Добавлено через 48 секунд может то, куда ты коннектишься, тупо висит? |
|||
|
||||
| mabrarov |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 100 Регистрация: 12.1.2011 Где: Казань Репутация: нет Всего: 9 |
Еще раз повторю:
Это сообщение отредактировал(а) mabrarov - 5.9.2011, 14:46 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 13 Всего: 110 |
||||
|
||||
| mabrarov |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 100 Регистрация: 12.1.2011 Где: Казань Репутация: нет Всего: 9 |
Все в курсе. Все (полностью) читали документацию. И все начинают оптимизировать (или просто боятся мифических циклических ссылок) и выкидывают enable_shared_from_this. Наболело. Если не лень - подсчитайте, сколько было аналогичных вопросов в списке рассылки по Asio. Да, можно обойтись без enable_shared_from_this. Но надо читать доки, где четко описаны требования к времени жизни всех компонент, входящих в асинхронную операцию. Надеюсь, я не прав и тут действительно баг в Asio. Без обид. Действительно буду рад найти и излечить баг (в Asio) раньше, чем он испортит жизнь лично мне. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |