Модераторы: feodorv

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> баг asio? или баг TCP стека? 
V
    Опции темы
MAKCim
Дата 10.4.2011, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 6
Всего: 207



Цитата(boostcoder @  10.4.2011,  06:57 Найти цитируемый пост)
но мне все равно не понятно, каким образом операция чтения запущенная одновременно с операцией записи может портить данные которые записываются 

предположу
start_read->async_read->readed
причем async_read->readed может быть синхронным (если данные уже получены)
в этом случае имеем два последовательных async_write без вызова written


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
phprus
Дата 10.4.2011, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 22.8.2006

Репутация: 1
Всего: 3



Цитата(boostcoder @  10.4.2011,  09:28 Найти цитируемый пост)
readed() вызывается когда данные прочитаны. из него я запускаю операцию записи и операцию чтения. и тут ошибка! операцию чтения нужно запускать из хэндлера операции записи. т.е. мало того что в доке намекается на то, что нельзя выполнять две операции записи и чтения одновременно, так оказывается что выполнять чтение пока не завершена запись(и наоборот) тоже нельзя!

А если использовать read и write параллельно с разными, несвязанными данными, то баг тоже воспроизведется? Если да, то это будет по сути баг в ASIO. TCP полнодуплексный протокол и может работать одновременно в обе стороны.

Цитата(boostcoder @  10.4.2011,  10:31 Найти цитируемый пост)
удивительно... но использование канала наладилось. 94%

На каком канале? 100 Мбит/с?
PM MAIL WWW ICQ   Вверх
mes
Дата 10.4.2011, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



Цитата(boostcoder @  10.4.2011,  05:28 Найти цитируемый пост)
start_write(sock, buf);
   start_read(sock); <<<<<<<<<<<<<<<<<<<<<<

у меня подозрения, что Вы не с причиной разобрались, а просто создали благоприятные условия, в которых _баг_  не/реже проявляется.. 
так же как и секундой слипа..

Добавлено через 10 минут и 47 секунд
Цитата(boostcoder @  10.4.2011,  05:28 Найти цитируемый пост)
но не в одной из цитат не говорится о том, что нельзя выполнять запись пока не завершилось чтение, и на оборот!
уверен, что можно  smile

Добавлено через 11 минут и 34 секунды
Цитата(boostcoder @  10.4.2011,  05:28 Найти цитируемый пост)
эх... держите меня семеро 

рано эмоции выпустили smile


--------------------
PM MAIL WWW   Вверх
mes
Дата 10.4.2011, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



Цитата(boostcoder @  10.4.2011,  05:57 Найти цитируемый пост)
но мне все равно не понятно, каким образом операция чтения запущенная одновременно с операцией записи может портить данные которые записываются

данные не портятся, просто приходят не одним куском , а несколькими, на что Вам намекал strlen..

Добавлено через 1 минуту и 55 секунд
а Вы их неправильно интерпретировали неполные блоки, что и служило поводом для исключения..
и еще сервер получив неправильный блок, переправлял его как полный клиенту.. поэтому ошибка только в логах server_out и client_in..

Добавлено через 3 минуты и 30 секунд
т.е. неправильная интерпретация полученных данных сервером,  создавала проблему с логами,
а неправильная интерпретаця клиентом вызывало исключение..

Добавлено через 5 минут и 54 секунды
в общем у Вас получился пример, ловко собравший в себе несколько похожих ошибок, и устранение одной, изменяло ситуацию, но не исправляло ее - именно это и привело к путанице..

Добавлено через 9 минут и 14 секунд
хотя помимо названных причин, вроде еще одна должна быть для полной картины..

Добавлено через 13 минут и 25 секунд
Цитата(boostcoder @  10.4.2011,  05:28 Найти цитируемый пост)
 start_write(sock, buf);
   start_read(sock); <<<<<<<<<<<<<<<<<<<<<<

Цитата(boostcoder @  10.4.2011,  05:28 Найти цитируемый пост)
 так оказывается что выполнять чтение пока не завершена запись(и наоборот) тоже нельзя!

не туда акцент..  проблема может быть не из за того, как говорится в цитате, что операция чтения запущена наряду с операцией записи,
а в том что, например, при чтении подряд можно запустить две операции записи.. 




--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 10.4.2011, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 13
Всего: 110



Цитата(phprus @  10.4.2011,  11:38 Найти цитируемый пост)
А если использовать read и write параллельно с разными, несвязанными данными, то баг тоже воспроизведется?

подозреваю что да. тут не данные навязывают ограничения, а asio.

Цитата(phprus @  10.4.2011,  11:38 Найти цитируемый пост)
Если да, то это будет по сути баг в ASIO. TCP полнодуплексный протокол и может работать одновременно в обе стороны.

возможно это действительно не баг, а ограничение реализации asio.
почитай: http://boost.2283326.n4.nabble.com/Multipl...-td2579621.html

Цитата(phprus @  10.4.2011,  11:38 Найти цитируемый пост)
100 Мбит/с?

да.
завтра смогу проверить на 1гбит канале.

Цитата(mes @  10.4.2011,  12:03 Найти цитируемый пост)
у меня подозрения, что Вы не с причиной разобрались, а просто создали благоприятные условия, в которых _баг_  не/реже проявляется.. 
так же как и секундой слипа..

так же, прочтите по ссылке.

Igor R. - это второй человек в поддержке asio. я полагаю весьма компетентный.


Цитата(mes @  10.4.2011,  12:03 Найти цитируемый пост)
уверен, что можно

да, можно. но не при помощи async_write(). нужно писать обертку над сокетом(сегодня этим и займемся ;) ), и в ней использовать socket::async_write_some() и socket::async_read_some(). на сколько я понял из того что по ссылке.

Добавлено через 1 минуту
тест работает почти 7 часов.
PM WWW   Вверх
mes
Дата 10.4.2011, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



кстати комбинация с перемещением start_read во written поможет только для пинг понговского обмена, как у Вас в примере.. 
при нарушении симметрии на чтение запись, опять начнутся проблемы при такой архитектуре..

Добавлено через 2 минуты и 21 секунду
Цитата(boostcoder @  10.4.2011,  11:34 Найти цитируемый пост)
тест работает почти 7 часов. 

будет работать, потому что Вы искусственно создали благоприятные условия.. 
шаг влево или вправо возродит этот баг  в каком то из его проявлений..

Добавлено через 2 минуты и 40 секунд
Цитата(boostcoder @  10.4.2011,  11:34 Найти цитируемый пост)
почитай: http://boost.2283326.n4.nabble.com/Multipl...-td2579621.html

сейчас..

Добавлено через 5 минут и 3 секунды
Цитата(boostcoder @  10.4.2011,  11:34 Найти цитируемый пост)
да, можно. но не при помощи async_write(). нужно писать обертку над сокетом(сегодня этим и займемся ;) ), и в ней использовать socket::async_write_some() и socket::async_read_some(). на сколько я понял из того что по ссылке.

нет не поняли smile я говорил что уверен, что нет ограничения, на одновременное использование async_write и async_read .. 
и уверен, что не это служило поводом для багов у Вас в примере..

Добавлено через 7 минут и 17 секунд
Цитата

hand, for async_write, since it is divided in many async_write_some, 

async_read() also performs multiple socket::async_read_some() 

ага так и предполагалось, из за чего ограничение на совместную запись/чтение.. 
но это никак не может служить ограничением на совмещением записи с чтением.. 



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 10.4.2011, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 13
Всего: 110



mes, насколько я понимаю, одновременное чтение/запись нужно реализовать согласно этому принципу: http://www.boost.org/doc/libs/1_46_0/doc/h...re/reactor.html

Добавлено через 1 минуту и 37 секунд
MAKCim, скажите, sendmsg() и recvmsg() можно использовать одновременно? т.е. с одним сокетом.
PM WWW   Вверх
mes
Дата 10.4.2011, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



Цитата(boostcoder @  10.4.2011,  12:21 Найти цитируемый пост)
sendmsg() и recvmsg() можно использовать одновременно? т.е. с одним сокетом. 

Цитата(phprus @  10.4.2011,  10:38 Найти цитируемый пост)
TCP полнодуплексный протокол и может работать одновременно в обе стороны.





--------------------
PM MAIL WWW   Вверх
MAKCim
Дата 10.4.2011, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 6
Всего: 207



Цитата(boostcoder @  10.4.2011,  13:21 Найти цитируемый пост)
скажите, sendmsg() и recvmsg() можно использовать одновременно? т.е. с одним сокетом. 

да
входной и выходной буферы сокета независимы
я даже больше скажу, можно одновременно из разных потоков делать sendmsg()
правда насчет атомарности записи данных (данные каждого sendmsg() запишутся непрерывно) не уверен


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
mes
Дата 10.4.2011, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



Цитата(boostcoder @  10.4.2011,  12:21 Найти цитируемый пост)
насколько я понимаю, одновременное чтение/запись нужно реализовать согласно этому принципу:

нужно ? можно и как у Вас было, только порядок навести.. 


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 10.4.2011, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 13
Всего: 110



mes, я это видел.
но я никогда такого не проделывал прежде. и тем более с sendmsg() и recvmsg().
я просто хочу понять, это ограничение asio, или OS-API.
PM WWW   Вверх
mes
Дата 10.4.2011, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



мне кажется Вы причины проблемы до сих пор не поняли, из за этого с ужасом ищете обходные варианты..

Добавлено @ 13:32
Цитата(boostcoder @  10.4.2011,  12:31 Найти цитируемый пост)
я просто хочу понять, это ограничение asio, или OS-API. 

что Вы подразумеваете под "это" ?.. 


Это сообщение отредактировал(а) mes - 10.4.2011, 13:32


--------------------
PM MAIL WWW   Вверх
MAKCim
Дата 10.4.2011, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 6
Всего: 207



 smile 
еще раз убедился в том, как С++ на примере boost'а усложняет жизнь
было бы что-то другое, можно было посмотреть реализацию и выяснить все вопросы
лезть же в boost удовольствие сомнительное ;)


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
boostcoder
Дата 10.4.2011, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 13
Всего: 110



Цитата(MAKCim @  10.4.2011,  13:30 Найти цитируемый пост)
да
входной и выходной буферы сокета независимы
я даже больше скажу, можно одновременно из разных потоков делать sendmsg()

понял. спасибо.

значит нужно автора asio закидать письмами с четкими вопросами.

Цитата(mes @  10.4.2011,  13:30 Найти цитируемый пост)
можно и как у Вас было, только порядок навести..

что конкретно нужно изменить?
я тоже понимаю что что-то не так. но согласно приведенной ссылке, во втором посте есть такое:
Цитата

Of course, you still can run async_read and async_write together for one connection. 

мне не кажется, что тут говорится о том, что можно читать и писать одновременно?
PM WWW   Вверх
mes
Дата 10.4.2011, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



Цитата(boostcoder @  10.4.2011,  12:36 Найти цитируемый пост)
мне не кажется, что тут говорится о том, что можно читать и писать одновременно? 

так Вам все об этом говорят smile что нет на это ограничений smile



--------------------
PM MAIL WWW   Вверх
Страницы: (8) Все « Первая ... 4 5 [6] 7 8 
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.1160 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.