Ни в .NET, ни в протоколе TCP ничего не встроено, чтобы определить размер сообщения, которое должно прийти заранее. Протокол TCP только указывает, что все данные будут переданы в конечную точку-получатель (или, по крайней мере, для этого будут приложены все усилия).
Вы несете единоличную ответственность за определение способа, позволяющего получателю знать, сколько данных нужно прочитать. Детали того, как вы это делаете, - как уже указывали другие, - зависят от характера того, что вы переносите: вы можете отправить длину сначала, как вы упомянули, вы можете кодировать специальные последовательности, называемые терминаторами, вы можете использовать предопределенные блоки данных поэтому все сообщения имеют одинаковый размер и т. д.
EDIT
Это началось как комментарий, но это больше, чем соответствует этому ограничению.
К добавить NULL в поток просто означает добавление символа с двоичным значением 0 (не путать с символом 0
). В зависимости от кодировки, которую вы используете для передачи (например, ASCII, UTF-8, UTF-16 и т. Д.), Которая может переводиться в отправку одного или более 0 байтов, но если вы используете соответствующий перевод, вам просто нужно поместить что-то вроде \0
в вашей строке. Вот пример:
string textToSend = "This is a NULL Terminated text\0";
byte[] bufferToSend = Encoding.UTF8Encoding.GetBytes(textToSend);
Конечно, все вышеперечисленное предполагает, что все остальные данные, которые вы отправляете, не содержат никаких других NULL. Это означает, что это текст, а не произвольные двоичные данные (например, содержимое файла). Это очень важно! В противном случае вы не можете использовать NULL в качестве терминатора сообщения, и вам придется придумать другую схему.