Я согласен - я не должен ожидать, что границы буфера совпадут, но я предполагаю, что это вопрос предсказуемого поведения.
В TCP на основе не существует предсказуемого поведениясвязь;между вами и удаленным хостом может быть любое количество маршрутизаторов, границ NAT, тупых прокси-серверов или чего-то еще, что диктует поведение, которое кажется неожиданным.byte .
Реальный мир, однако, поведение обычно довольно предсказуемо.Но не всегда, никогда в 100% случаев, и всегда с потенциалом какого-то клиента где-то с забитыми трубками.
С TCP вы, по крайней мере, гарантированы, что обычно пакетов будутполученные в порядке они отправляются, если нет ошибки.Предположим, опять же, что все точки между ними реализованы правильно или не являются вредоносными (этот последний бит означает, что вы должны предполагать, что иногда данные будут повреждены).
Даже эта гарантия мало что значит;вы можете получить первые 8 из 10 пакетов ... или вы можете получить все входящие данные только для того, чтобы обнаружить, что исходящее соединение разорвано, когда вы собираетесь отвечать ...
Итог;Ваш алгоритм буферизации с обеих сторон должен предполагать, что буфер может быть заполнен случайными пакетами, которые полностью не соответствуют размеру данных, застрявших на другой стороне.Хотя не требуется строго , ваше приложение будет лучше защищено от случайных сбоев соединения;против усеченных буферов, случайных разрывов соединений и повреждения данных.
Ранние поля длины байта и контрольные суммы - ваш друг.Предположения, вы! Hjfdahjdas8y! $ (& ($ @ # & ^ @ #) ^ &! @ # & _ [потерянное соединение]