Как мне убедиться, что все мои данные были получены, прежде чем я попытаюсь их сконструировать и что-то с ними сделать?
Вы должны реализовать некоторый протокол, чтобы вы знали.
Хотя протокол TCP надежен, он не гарантирует, что данные от одной записи на одном конце сокета будут отображаться как одно чтение на другом конце: повторные попытки, фрагментация пакетов и MTU могут привести к получению данных в разных размерные единицы получателем. Вы получите данные в правильном порядке.
Таким образом, при отправке необходимо включить некоторую информацию, позволяющую получателю узнать, когда у него есть полное сообщение. Я также рекомендовал бы указать, какое сообщение и какую версию данных (это послужит основой для совместной поддержки различных версий клиента и сервера).
Итак, отправитель отправляет:
- Тип сообщения
- версия сообщения
- Размер сообщения (в байтах)
И получатель будет зацикливаться, выполняя чтение с буфером и добавляя его в главный буфер (MemoryStream
подходит для этого). Как только полный заголовок получен, он знает, когда были получены полные данные.
(Другой способ - включить какой-либо шаблон в качестве маркера «конец сообщения», но затем вам нужно обработать ту же последовательность байтов, встречающуюся в содержимом - трудно сделать, если данные являются двоичными, а не текстовыми.)