Хорошо ... попробуй и пойми это.TCP Sockets - это не передача пакетов по сети (по крайней мере концептуально), это фактически поток байтов, которые передаются в той же последовательности для получения на другом конце, без сбоев.
Теперь нижнийуровни (IP и т. д.) разбивают поток на пакеты и отправляют его по сети.Стек TCP на принимающей стороне повторно собирает пакеты (при необходимости запрашивает повторные передачи) и снова формирует поток из него, как и когда он продолжает получать пакеты от нижних уровней.Вызов сокета read()
в месте назначения извлечет вам байты, которые были получены в потоке до сих пор.Таким образом, вы никогда не можете быть уверены, что один вызов read()
соберет вам все отправленные данные.
Хитрость заключается в использовании нескольких вызовов read()
.У вас может быть два возможных сценария для решения этой проблемы:
(1) Когда вы знаете, сколько именно байтов вы должны получить.Здесь вы просто продолжаете вызывать read()
, пока не получите указанное количество байтов.
(2) Когда вы не знаете, сколько байтов вы должны получить.Это довольно сложно.Здесь вы должны выбрать Страж.Итак, в конце отправки вы отправляете все данные, которые вам нужно отправить, а затем отправляете этого Стража.К тому времени, когда я уверен, что вы уже поняли, что на приемном конце вы продолжаете read()
, пока не получите Sentinel.
Никогда не думайте о TCP-сокетах как о пакетах.Его легко погрузить, когда вы думаете о них как о потоках.