Я читал о TCP-пакете и о том, как их можно разделить сколько угодно раз во время рейса. Я принял это, чтобы предположить, что мне понадобится реализовать какой-то буфер в верхней части буфера, используемого для фактического сетевого трафика, чтобы хранить каждый ReceiveAsync()
до тех пор, пока не будет достаточно данных для синтаксического анализа сообщения. Кстати, я отправляю длинные префиксные, протобуф-сериализованные сообщения по TCP.Как поступает пакет TCP при использовании Socket api в C#
Затем я прочитал, что нижние слои (ethernet ?, IP?) Будут фактически собирать пакеты прозрачно.
Вопрос, на C#, я гарантированно получаю полное «сообщение» по TCP? Другими словами, если я отправлю 32 байта, я обязательно получу эти 32 байта в «одноразовом» (один звонок до ReceiveAsync()
)? Или мне нужно «хранить» каждый прием до тех пор, пока количество полученных байтов не будет равно префиксу длины?
Кроме того, могу ли я получить еще, чем одно сообщение в один звонок по номеру ReceiveAsync()
? Скажем, одно сообщение «protobuf» составляет 32 байта. Я отправляю 2 из них. Могу ли я получить 48 байтов в «один раз», а затем 16 в другом?
Я знаю, что этот вопрос легко появляется в Google, но я не могу сказать, соответствует ли он в правильном контексте (речь идет о фактическом протоколе TCP или о том, как C# будет показывать сетевой трафик программисту).
Спасибо.
В то время как данные TCP могут быть разделены и проходить разные маршруты во время рейса, достаточно сказать, что это на 100% прозрачно для приложений. Все, что вам нужно сделать, это получить его в безопасности, зная, что оно собрано для вас. Это НЕ относится к UDP – MickyD
@MickyD Пока ваши утверждения верны, я думаю, что вам не хватает точки вопроса. Он спрашивает о количестве данных, доступных для приложения в любой момент. –
@JonathonReinhart Вот почему это комментарий не ответ – MickyD