Могут ли данные TCP перекрываться в буфере - PullRequest
1 голос
/ 30 марта 2012

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

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

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

Ответы [ 3 ]

1 голос
/ 30 марта 2012

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

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

0 голосов
/ 30 марта 2012

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

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

0 голосов
/ 30 марта 2012

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

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

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