![]() |
Модераторы: feodorv |
![]() ![]() ![]() |
|
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 13 Всего: 110 |
вручную управлять памятью страшно
![]() |
|||
|
||||
phprus |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 22.8.2006 Репутация: 1 Всего: 3 |
boostcoder
Везде да. У меня к каждому клиенту привязан объект класса Client, который привязан к одному io_service и который гарантированно работает в одном потоке. В качестве буферов (которые и передаются asio) используется два std::vector<char>, как поля класса Client, а данные получаемые из другого потока в виде обычного указателя используются очень локализовано и после чего удаляются, по этому я и согласился на ручное управление памятью, а не стал дальше думать, как обойти такое ограничение shared_ptr. Это сообщение отредактировал(а) phprus - 2.4.2011, 23:18 |
|||
|
||||
boostcoder |
|
||||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 13 Всего: 110 |
убрал из кода все смарт-поинтеры.
проблема осталась ![]() на стороне клиента, сохраняю отправляемые массивы в файл, чтоб убедится в том, что массивы не портятся. так и есть. массивы не искаженны. ![]() на стороне сервера, так же, сохраняю принятые массивы. но тут, массив приходит искаженным: ![]() вот снифф этого участка, tcpdump`ом, на стороне клиента: ![]() а это на стороне сервера: ![]() на стороне клиента, как раз в то место где данные искаженны, добавлены какие-то данные. не мои. видно, что на стороне сервера, массив, после прочтения при помощи asio, уже испорчен. но tcpdump показывает что массив не испорчен. я в замешательстве ![]() выложу код в тему, в надежде, что кто-то внесет ясность в ситуацию. клиент:
http://liveworkspace.org/code/15c1e78ea451...f1eebe7e08564a7 сервер:
http://liveworkspace.org/code/0a8e2cb728f8...d31f28c46ddf9e2 общий хидер:
http://liveworkspace.org/code/fa23c521eab1...320dcff6290e656 всем спасибо. зы во вложении, архив с исходниками и Makefile`ом. проверено на gcc-linux и на mingw32. Это сообщение отредактировал(а) boostcoder - 8.4.2011, 01:24 Присоединённый файл ( Кол-во скачиваний: 3 ) ![]() |
||||||
|
|||||||
phprus |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 22.8.2006 Репутация: 1 Всего: 3 |
Из замеченного при помощи wireshark:
Когда включен - TCP-сегменты ходят с данными ровно в 13 байт и у каждого стоит флаг PUSH (сразу отдавать на уровень выше, те приложению). Когда sleep выключен сегменты содержат множество склееных блоков по 13 байт (возможно не целое число блоков). А что говорят по этому поводу на https://svn.boost.org/trac/boost/ ? Может быть имеет смысл написать Bug report? |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 13 Всего: 110 |
при помощи strace обнаружил, что для ввода-вывода используются sendmsg() и recvmsg(), а не send() и recv() как предполагал.
это я тоже заметил. любопытно почему так происходит. но это сейчас не главное.
та я потому и не писал, ибо все же не был уверен что это не мой баг в коде. сейчас напишу.. |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 13 Всего: 110 |
вот что еще странно...
в один прекрасный момент, сервер принимает это: ![]() в первой строке сверху - все хорошо. во второй и третьей строке, вместо завершающего нуля, вставлен символ c в четвертой строке, символа c вначале, попросту нет. |
|||
|
||||
phprus |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 22.8.2006 Репутация: 1 Всего: 3 |
boostcoder
Если sleep сделать с временем ожидания, равным 0 ( boost::this_thread::sleep(boost::posix_time::microseconds(0)) ) то проблема тоже уходит, а sleep(0) в теории должен вызывать передачу управления другому процессу, те в коде похоже зарылась гонка. Только не могу понять в каком коде.
Сообщите пожалуйста ссылку на тикет. Это сообщение отредактировал(а) phprus - 9.4.2011, 09:41 |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 13 Всего: 110 |
||||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 13 Всего: 110 |
phprus, так у тебя этот баг тоже воспроизводиться?
скажи как тестируешь? версии ОС, компилятора, boost? локально, удаленно? |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 6 Всего: 207 |
ну так это может быть пустой пакет с tcp флагами... хотя я не очень понимаю формат снифа еще проверь у себя версию в аттаче там логинг asio заменен а логинг sendmsg/recvmsg Присоединённый файл ( Кол-во скачиваний: 4 ) ![]() -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
phprus |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 22.8.2006 Репутация: 1 Всего: 3 |
Да, воспроизводится. Boost 1.46.1 openSUSE 11.3 (2.6.34.7-0.7-desktop) g++ (SUSE Linux) 4.5.0 20100604 [gcc-4_5-branch revision 160292] Тестирую локально, путем запуска сервера и клиента с двух соседних консолей в Konsole. |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 6 Всего: 207 |
и еще
вы пробовали запускать io_service::run не в отдельном потоке? -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
phprus |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 22.8.2006 Репутация: 1 Всего: 3 |
В реальной сети, с rtt min/avg/max/mdev = 5.226/5.250/5.281/0.023ms баг воспроизводится значительно быстрее. В среднем до падения проходит 0,1 - 0,3 секунды, а в случае с локальным запуском код работает до падения минимум несколько секунд. Но тут boost 1.46.0 и CentOS с родным GCC 4.1.2.
|
|||
|
||||
boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 13 Всего: 110 |
сделал. на локальной машине. в аттаче. это 7z архив. расширение сменил потому что форум не позволяет приаттачивать 7z. скажите как сделать? а то я не очень разбираюсь в снифферах. Добавлено @ 15:52 в последних исходниках теста, сервер, я так и сделал. а клиенту, помимо того, что отправлять сообщения в цикле, нужно еще и принимать ответы от сервера. потому там я оставил один поток. Добавлено через 11 минут и 24 секунды
проверил. у меня ничего не изменилось. ubuntu-10.10 gcc-4.5.1 boost-1.46.1 Это сообщение отредактировал(а) boostcoder - 9.4.2011, 15:55 Присоединённый файл ( Кол-во скачиваний: 2 ) ![]() |
||||
|
|||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 6 Всего: 207 |
boostcoder,
эмм так а в чем проблема это все делать в одном потоке? делаешь async_read, потом async_write далее run и уже в обработчиках written/readed генерируешь новые операции... или я ошибаюсь? Добавлено через 1 минуту и 14 секунд в общем нужно, имхо, избавиться от более одного потока в клиенте и сервере и снова проверить Добавлено через 2 минуты и 4 секунды вот я не понимаю, как этот скрин был получен -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |