crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

4 страниц V  < 1 2 3 4 >  
Ответить в данную темуНачать новую тему
> Получение и обработка пакетов TCP/IP
Алексей1153
  опции профиля:
сообщение 14.1.2011, 21:22
Сообщение #21


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(silver47 @ 14.1.2011, 20:55) *
Как Этого избежать?


1) ставить в данных метки (способов много, зависит от задачи)
2) использовать UDP ( тут система выдаёт при чтении ровно один пакет - хотя, могу ошибаться, но вроде так получалось. Если что, меня сейчас поправят :) )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 16.1.2002, 23:58
Сообщение #22


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 1.4.2010
Пользователь №: 1584

Спасибо сказали: 40 раз(а)




Репутация:   6  


Цитата(Алексей1153 @ 14.1.2011, 23:22) *
Цитата(silver47 @ 14.1.2011, 20:55) *
Как Этого избежать?


1) ставить в данных метки (способов много, зависит от задачи)
2) использовать UDP ( тут система выдаёт при чтении ровно один пакет - хотя, могу ошибаться, но вроде так получалось. Если что, меня сейчас поправят :) )


Вот чего прочитал:

Передавать данные можно либо в виде текста, либо в виде блоков с данными (QTextStream и QDataStream). Для того чтобы определить можно ли читать данные из текстового потока, нужно вызвать QTcpSocket::canReadLine() а читать QTcpSocket::readLine(); Для блочных данных в начале передается размер блока, затем уже сам блок, и читаем только тогда, когда QTcpSocket::bytesAvailable() больше этого блока.

Вроде как-то так.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 15.1.2011, 15:21
Сообщение #23


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


up
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 15.1.2011, 20:15
Сообщение #24


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


silver47, абсолютно без разницы, текст это будет или бинарные данные (текст, вернее ASCII, - это тоже бинарные данные, только 7-й бит равен нулю у всех байтов)

Цитата(silver47 @ 17.1.2002, 1:58) *
Для блочных данных в начале передается размер блока, затем уже сам блок, и читаем только тогда, когда QTcpSocket::bytesAvailable() больше этого блока.

для простых случаев сканает, но для серьёзных решений не пойдёт.

по хорошему, нужно ставить маркер начала (некий условный байт) - так мы точно знаем, что вот, например, тут может начаться сообщение, а всё до - мусор.
Затем идёт общий участок, где содержится указание длины и контрольная сумма (например, CRC16 с полиномом 0x1021). Ждём, когда придёт достаточное количество данных. По достижении - проверяем КС.
1) не совпала - значит ищем следующий байт-маркер.
2) совпала - значит с большой вероятностью получено отдельное сообщение

Кстати, не исключено, что в Qt уже есть готовое решение.

Сообщение отредактировал Алексей1153 - 15.1.2011, 20:16
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 15.1.2011, 20:35
Сообщение #25


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(Алексей1153 @ 15.1.2011, 20:15) *
по хорошему, нужно ставить маркер начала (некий условный байт) - так мы точно знаем, что вот, например, тут может начаться сообщение, а всё до - мусор.

А откуда может взяться мусор?
Для чего другой стороне посылать этот мусор?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 15.1.2011, 20:42
Сообщение #26


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


BRE, всякое бывает. Например, помеха при передаче, или ошибка в программе, из-за которой часть сообщения предыдущего пропала.

Ну, я не спорю, что когда всё идеально, про эту фигню можно не задумываться :)

кстати, описанная схема проверена мной на практике на очень плохих по качеству соединениях :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 15.1.2011, 20:51
Сообщение #27


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


TCP гарантирует целостность данных "из коробки". Какие помехи? ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 15.1.2011, 21:02
Сообщение #28


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


BRE, гарантии нигде быть не может :) Отправитель может злоумышленно или из-за ошибки присылать левые пакеты. И всё - прощай нормальные сообщения на приёме. Это уже пройдено также на практике :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 15.1.2011, 21:06
Сообщение #29


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(Алексей1153 @ 15.1.2011, 21:02) *
BRE, гарантии нигде быть не может :) Отправитель может злоумышленно или из-за ошибки присылать левые пакеты. И всё - прощай нормальные сообщения на приёме. Это уже пройдено также на практике :)

Ну так этот же отправитель может умышленно или из-за ошибки устанавливать нужные маркеры. Не? ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 15.1.2011, 21:35
Сообщение #30


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


может, конечно. Но тогда ни одного сообщения не будет получено, что уже показатель кривой работы чего-либо :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

4 страниц V  < 1 2 3 4 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 16.1.2025, 0:40