2012-03-30 1 views
1

Если я продолжаю отправлять данные в приемник, возможно, что данные, посланные, перекрываются так, что они накапливаются в буфере, и поэтому следующее чтение в буфер считывает также данные других отправленных данных ?Может ли TCP-наложение перекрываться в буфере

Я использую Qt и readAll() для получения данных и их анализа. Эти данные имеют некоторую структуру в нем, поэтому я могу узнать, завершены ли данные или действительно ли они действительные данные, но я обеспокоен тем, что другие данные будут перекрываться с другими, когда я вызываю readAll(), и поэтому приведет к недействительности этого предположения, быть действительными данными.

Если это может произойти, как мне его предотвратить или контролировать? Или это то, о чем беспокоится OS/API? Я беспокоюсь частично из-за того, как называется метод. lol

+5

8 месяцев, 18 вопросов, ** 0 голосов **. Двигаемся вперед. – cnicutar

+0

Если 'readAll' испортил собственный буфер (то, что вы описываете), это было бы бесполезно. – Mat

+0

Я не уверен, что значит иметь поврежденный буфер. То, как я это вижу, это просто непрерывная линия памяти, которая заполняется по мере поступления данных. – lightburst

ответ

0

В соответствии с http://qt-project.org/doc/qt-4.8/qiodevice.html#readAll эта функция snarfs все данные и возвращает ее как массив. Я не вижу, как API вызывает проблемы с перекрывающимися данными. Массив возвращается значением, и учитывая, что он представляет весь поток, так что бы он даже перекрывал? Вы обеспокоены тем, что на возвращаемом объекте есть ссылочная семантика (т. Е. Что он просто содержит указатели на хранилище, которые повторно используются в других вызовах для одной и той же функции?)

Если буферы отправки и получения перекрываются в любой системе, это ошибка, если не будет особо осторожно, чтобы использование было полностью сериализовано. (Например, буфер используется как только для отправки и только для приема, без какого-либо смешивания.)

+0

Нет. Я имею в виду, если у меня есть отправитель, который непрерывно отправляет данные получателю, когда приемник читает буфер, есть шанс, что приемник поймает некоторые из другие отправленные данные. Скажем, отправленные данные являются отдельными строками, будет ли строка1 считываться с некоторой частью строки2 приемником? – lightburst

+0

Похоже, что то, что вы описываете, является проблемой разграничения/кадрирования, а не «перекрытием». Функция читает все поток до конца, поэтому string1 и string2 будут в буфере. – Kaz

0

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

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

1

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

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

Смежные вопросы