Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > [boost asio] ошибка при выполнени |
Автор: cupper 28.12.2010, 11:01 | ||||||
Пытаюсь реализовать следующее. Есть класс, он умеет сериализоваться. Нужно передать его с клиента на сервер, на сервере с ним что то сделать, и вернуть назад. Логика работы следующая. есть класс Connection, с реализованными шаблонными функция для отправки и принятия данных.
класс взят из тутториала и допилен. Есть класс client который. Единственная особенность которую можно унего выделить это то что класс содержит два указателя (один обычный, указывающий на отправляемые данные, один умных для принимаемых данных, что бы не следить за их корректным удалением)
есть серверный класс, который содержит просто один умный указатель (он указывает на пустой объект который моздается в конструкторе, в него производится десереализация данных, их модификация и отправка обратно клиенту.
это все собирается, запускается сервер, запускается клиент. Данные с клиента уходят, на сервере принимаються, к ним добавляется еще один елемент, они отправляются, перезапускается ожидание нового подключения (происходит в функции handle_read) И до функции handle_write на которой полный цикл работы должен завершиться, недоходит. Вылетает ошибка студии об ошибке отлабки, и несодержащая вообше не какой полезной информации. До клиента данные благополучно доходят. Ошибка возникает на стороне сервера. Найти или понять где я не в силах, вообще понятие не приложу в чем проблемма. http://d.imagehost.org/view/0743/error Возможно ктото предложит более лучьшую реализацию задуманного, которая возможно поможет устранить данную ошибку. Буду рад любой помощи. |
Автор: cupper 30.12.2010, 15:42 | ||||||
после долгих экспериментов было выявлено что если сделать логику такой: клиент отправляет данные серверу, данный принимает и выводит (и.е. по одному действия) то все корректно работает. Если же так: клиент отправляет данные первый раз, сервер принимает и на этом же соединении ожидает еще данных, после отправки клиентом второй порции данных сервер (тех же самых, точно также, но на уже открытом соединении) сервер (точно также получает их, но на уже открытый acceptor) не может их корректно получить, ошибка проиходит в connection.hpp
после выполнение операции цтения и переходе в
inbound_header_ содержит уже не массив char из 8 символов, а хрен пойми что. Соответственно из за этого хрен пойми что условие в
является true и мы выходим с ошибкой :( |
Автор: bsa 31.12.2010, 12:02 |
cupper, на твоем бы месте, я вместо T*data использовал что-то с управляемым временем жизни, например shared_array. Потому что не исключена ситуация, что хэндл из async_read срабатывает уже после того, как память из-под data будет освобождена. И вообще, код у тебя ужасный. Может, правда, дело в том, что ты делаешь шаблоны... |
Автор: cupper 10.1.2011, 01:37 | ||
функции типа async_read приведенные выше это чернорабочие функции класса Connection, он ничего не знает о данных и не следит за ними. работа с данными происходит в классах Server и Client, там как раз реализованы умные указатели и прочее интеллектуальное поведение. PS. коли код ужасен, дайте пожалуйста пример прекрасного кода для поставленных целей ? |
Автор: cupper 10.1.2011, 18:47 |
Хммммм.... а может это быть баг студии или asio под Win? Взял исходники, навоял cmake сборщик, собрал на убунте... работает, ошибок нет, не вылетает. Сервер не падает, несколько раз запускаю клиент данные отправляются и принимаются и не каких ошибок... очень странно... PS. Прикрепляю проект, в сборке для Visual Studio 2010 и Cmake, кому не лень можете проверить будут ли у вас какие либо ошибки при выполнении проявляться. |
Автор: cupper 10.1.2011, 19:25 |
под VS2010 (для обоих необходимо наличие boost желательно последнего). PS. перенесите пожалуйста тему в раздел "Сети". |
Автор: cupper 11.1.2011, 13:07 | ||
ошибка кажется нашлась... PS. ошибка была в том что терялся объект connection после передачи управления в
на клиенте такой проблеммы не возникало потому что объект Cnnection существовал в единственно экземпляре и был членом класса Client, тобишь разрушался только когда разрушался сам объект класса Client, тобишь. В классе сервер, юзается немного другая логика, там членом класса является объект acceptor, а Connetction создается для каждого нового подключения, и то бишь уничтожался раньше чем нужно было. а это чуть ли не во время работы функции, и при обращении к членам Connection (из его же методов) их как бы уже и не небыло. Все это очень приблизительно, и пока не понятно, починил я непосредственно частный случай ошибки, или логику в целом. |
Автор: boostcoder 11.1.2011, 13:15 |
поздравляю ![]() |
Автор: cupper 11.1.2011, 20:03 | ||||||
вопрос лично тебе (так как ты говорил что ты с asio рабоал) вот есть код
что бросается в глаза ? и есть ли тут грубая ошибка ?. handle_write, ничего не делает. На нем как бы завершается работа для данного сеанса. |
Автор: boostcoder 11.1.2011, 20:27 |
бардак в структуре ![]() к примеру, класс Server. его основная задача - принимать соединения/логировать, и т.д.. но не общаться с клиентами. зачем ему методы handle_read() и handle_write() - загадка ![]() для общения, у тебя есть класс Connection. но вот что странно - он не наследует enable_shared_from_this ![]() как ты удаляешь объекты Connection ? |