![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
cupper |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
Пытаюсь реализовать следующее. Есть класс, он умеет сериализоваться. Нужно передать его с клиента на сервер, на сервере с ним что то сделать, и вернуть назад.
Логика работы следующая. есть класс Connection, с реализованными шаблонными функция для отправки и принятия данных.
класс взят из тутториала и допилен. Есть класс client который. Единственная особенность которую можно унего выделить это то что класс содержит два указателя (один обычный, указывающий на отправляемые данные, один умных для принимаемых данных, что бы не следить за их корректным удалением)
есть серверный класс, который содержит просто один умный указатель (он указывает на пустой объект который моздается в конструкторе, в него производится десереализация данных, их модификация и отправка обратно клиенту.
это все собирается, запускается сервер, запускается клиент. Данные с клиента уходят, на сервере принимаються, к ним добавляется еще один елемент, они отправляются, перезапускается ожидание нового подключения (происходит в функции handle_read) И до функции handle_write на которой полный цикл работы должен завершиться, недоходит. Вылетает ошибка студии об ошибке отлабки, и несодержащая вообше не какой полезной информации. До клиента данные благополучно доходят. Ошибка возникает на стороне сервера. Найти или понять где я не в силах, вообще понятие не приложу в чем проблемма. ![]() Возможно ктото предложит более лучьшую реализацию задуманного, которая возможно поможет устранить данную ошибку. Буду рад любой помощи. |
||||||
|
|||||||
cupper |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
после долгих экспериментов было выявлено что если сделать логику такой:
клиент отправляет данные серверу, данный принимает и выводит (и.е. по одному действия) то все корректно работает. Если же так: клиент отправляет данные первый раз, сервер принимает и на этом же соединении ожидает еще данных, после отправки клиентом второй порции данных сервер (тех же самых, точно также, но на уже открытом соединении) сервер (точно также получает их, но на уже открытый acceptor) не может их корректно получить, ошибка проиходит в connection.hpp
после выполнение операции цтения и переходе в
inbound_header_ содержит уже не массив char из 8 символов, а хрен пойми что. Соответственно из за этого хрен пойми что условие в
является true и мы выходим с ошибкой :( Это сообщение отредактировал(а) cupper - 30.12.2010, 17:07 |
||||||
|
|||||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
cupper, на твоем бы месте, я вместо T*data использовал что-то с управляемым временем жизни, например shared_array. Потому что не исключена ситуация, что хэндл из async_read срабатывает уже после того, как память из-под data будет освобождена.
И вообще, код у тебя ужасный. Может, правда, дело в том, что ты делаешь шаблоны... |
|||
|
||||
cupper |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
функции типа async_read приведенные выше это чернорабочие функции класса Connection, он ничего не знает о данных и не следит за ними. работа с данными происходит в классах Server и Client, там как раз реализованы умные указатели и прочее интеллектуальное поведение. PS. коли код ужасен, дайте пожалуйста пример прекрасного кода для поставленных целей ? Это сообщение отредактировал(а) cupper - 10.1.2011, 14:48 |
|||
|
||||
cupper |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
Хммммм.... а может это быть баг студии или asio под Win? Взял исходники, навоял cmake сборщик, собрал на убунте... работает, ошибок нет, не вылетает. Сервер не падает, несколько раз запускаю клиент данные отправляются и принимаются и не каких ошибок... очень странно...
PS. Прикрепляю проект, в сборке для Visual Studio 2010 и Cmake, кому не лень можете проверить будут ли у вас какие либо ошибки при выполнении проявляться. Это сообщение отредактировал(а) cupper - 10.1.2011, 19:23 Присоединённый файл ( Кол-во скачиваний: 5 ) ![]() |
|||
|
||||
cupper |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
под VS2010 (для обоих необходимо наличие boost желательно последнего).
PS. перенесите пожалуйста тему в раздел "Сети". Это сообщение отредактировал(а) cupper - 10.1.2011, 19:38 Присоединённый файл ( Кол-во скачиваний: 7 ) ![]() |
|||
|
||||
cupper |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
ошибка кажется нашлась...
PS. ошибка была в том что терялся объект connection после передачи управления в
на клиенте такой проблеммы не возникало потому что объект Cnnection существовал в единственно экземпляре и был членом класса Client, тобишь разрушался только когда разрушался сам объект класса Client, тобишь. В классе сервер, юзается немного другая логика, там членом класса является объект acceptor, а Connetction создается для каждого нового подключения, и то бишь уничтожался раньше чем нужно было. а это чуть ли не во время работы функции, и при обращении к членам Connection (из его же методов) их как бы уже и не небыло. Все это очень приблизительно, и пока не понятно, починил я непосредственно частный случай ошибки, или логику в целом. Это сообщение отредактировал(а) cupper - 11.1.2011, 19:43 |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
поздравляю
![]() |
|||
|
||||
cupper |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
вопрос лично тебе (так как ты говорил что ты с asio рабоал) вот есть код
что бросается в глаза ? и есть ли тут грубая ошибка ?. handle_write, ничего не делает. На нем как бы завершается работа для данного сеанса. |
||||||
|
|||||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
бардак в структуре ![]() к примеру, класс Server. его основная задача - принимать соединения/логировать, и т.д.. но не общаться с клиентами. зачем ему методы handle_read() и handle_write() - загадка ![]() для общения, у тебя есть класс Connection. но вот что странно - он не наследует enable_shared_from_this ![]() как ты удаляешь объекты Connection ? Это сообщение отредактировал(а) boostcoder - 11.1.2011, 20:31 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |