Russian Qt Forum
Апрель 26, 2024, 16:01 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: readAll() и фрагментация  (Прочитано 4112 раз)
AlphaGh0St
Гость
« : Январь 29, 2016, 17:12 »

Всем привет!
Отправляю по сети, из одной программы, структуру размером в 320 байт, затем отправляю ещё данные.
В принимающей программе по сигналу readyRead, в слоте вызываю readAll().

По идее слот на readyRead должен был вызваться дважды. В первый раз должна была быть принята структура, размером в 320 байт. А вторым вызовом приняты остальные данные.

А на деле, слот на readyRead вызывается один раз и метод readAll() возвращает все данные сразу: и структуру и остальные данные.
Складывается впечатление, что на уровне ОС или Qt происходит фрагментация данных, идущих из сети.

Подскажите, что можно сделать, чтобы принимать данные раздельно, т.е. без фрагментации?
Отправили структуру - приняли структуру.
Отправили остальные данные - приняли остальные данные.

Благодарю.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #1 : Январь 29, 2016, 17:16 »

Не стоит этого делать. Нужно нормально разбирать принятые данные.
Читайте про алгоритм Nagle, там все объясняется.
Записан
AlphaGh0St
Гость
« Ответ #2 : Январь 29, 2016, 17:28 »

Как раз наткнулся на алгоритм Nagle при внимательном чтении документации по сокетам.
Спасибо за совет.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Январь 30, 2016, 08:47 »

Подскажите, что можно сделать, чтобы принимать данные раздельно, т.е. без фрагментации?
Отправили структуру - приняли структуру.
Отправили остальные данные - приняли остальные данные.
Сетью занимаюсь раз в неск лет, ни о каких алгоритмах не слыхал. Тем не менее берусь утверждать: такой задачи лучше не ставить. Всегда можно посмотреть сколько байт пришло, если этот число меньше размера заголовка - ничего не делать. Как только весь заголовок пришел - считали его, разобрали и получили из него размер данных. И начинаете сливать данные до упора
Записан
Bepec
Гость
« Ответ #4 : Январь 30, 2016, 09:26 »

Алгоритм Нейгла по сути это буфер для малых сообщений. Он не везде подойдёт, особенно там где требуется нормальный отклик.

На вашем месте я бы прислушался к Igors, принимаете данные, разбиваете по заголовкам и парсите.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #5 : Январь 30, 2016, 09:43 »

На вашем месте я бы прислушался к Igors, принимаете данные, разбиваете по заголовкам и парсите.
А чем совет Igors отличается от моего?  Смеющийся
Я посоветовал почитать про алгоритм Нагла, потому что он объясняет поведение сетевого стека, что даст ТС понимание для чего это делается.
Но можно ничего не читать, а сделать как кажется. Улыбающийся
Ну и не во всех протоколах есть те самые чудо заголовки.
« Последнее редактирование: Январь 30, 2016, 09:51 от Old » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.043 секунд. Запросов: 22.