Во-первых, давайте отделим мух от котлет. Пакеты в TCP, у вас - буфер.
Во-вторых, TCP гарантирует доставку пакета (в заданном вами при отправке порядке). Пока пакет не будет передан целиком и полностью, стек TCP/IP будет его повторять. Алгоритм протокола такой. Однако, бывают обстоятельства сильнее TCP (пропадание коннекта из этой серии) и любая программа должна закладываться на то, что данные могут не дойти или дойти не полностью.
В-третьих, если у вас пришли не все данные в буфер, которые вы ждёте, то надо либо передавать контрольную сумму (что делать, если не [вся] пришла она?), либо, что правильнее, передавать не плоский буфер, а некую структуру данных, у которой вы можете проверить, что значения полей изменились (были заполнены при приёме данных) по сравнению с начальными. И исходя из этого решить, что структура пришла вся (последнее поле, например - контрольная сумма, по-умолчанию - 0) или её надо запрашивать заново.
А вы как хотели? Как в сказке? Как в сказке можно писать, если ваша программа 101% работает только и исключительно в локальной сети. В этом случае отрыв коннекта или сегмента - аварийная ситуация и не вам её исправлять.