Получение и обработка пакетов TCP/IP |
Здравствуйте, гость ( Вход | Регистрация )
Получение и обработка пакетов TCP/IP |
Алексей1153 |
14.1.2011, 21:22
Сообщение
#21
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
|
|
|
silver47 |
16.1.2002, 23:58
Сообщение
#22
|
Активный участник Группа: Участник Сообщений: 356 Регистрация: 1.4.2010 Пользователь №: 1584 Спасибо сказали: 40 раз(а) Репутация: 6 |
Как Этого избежать? 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-й бит равен нулю у всех байтов)
Для блочных данных в начале передается размер блока, затем уже сам блок, и читаем только тогда, когда 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: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 |
BRE, гарантии нигде быть не может Отправитель может злоумышленно или из-за ошибки присылать левые пакеты. И всё - прощай нормальные сообщения на приёме. Это уже пройдено также на практике Ну так этот же отправитель может умышленно или из-за ошибки устанавливать нужные маркеры. Не? |
|
|
Алексей1153 |
15.1.2011, 21:35
Сообщение
#30
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
может, конечно. Но тогда ни одного сообщения не будет получено, что уже показатель кривой работы чего-либо
|
|
|
Текстовая версия | Сейчас: 16.1.2025, 0:40 |