Вы должны, и фактически должны зацикливаться, чтобы отправлять данные кусками.
Как объяснено в сетевом руководстве Биджа:
"send () возвращает количество фактически отправленных байтов - это может быть меньше, чем число, которое вы сказали ему отправлять! Видите, иногда вы говорите ему отправить целую кучу данных, и он просто не может с этим справиться . Он сработает как можно больше данных и позволит вам отправить остальные позже. "
Это означает, что даже если вы установите размер пакета в 1 МБ, функция send () может отправлять не все, и вы будете вынуждены выполнять цикл до тех пор, пока общее количество байтов, отправленных вашими вызовами send (), не составит количество байтов, которые вы пытаетесь отправить. Фактически, чем больше размер пакета, тем больше вероятность того, что send () не отправит все это.
Помимо всего этого, вы не хотите отправлять пакеты размером 1 МБ, потому что если они будут потеряны, вам придется снова передавать весь пакет размером 1 МБ, тогда как, если вы потеряли пакет размером 1 КБ, его повторная передача не имеет большого значения.
Таким образом, вам придется зациклить ваши вызовы send (), а получателю также придется зациклить свои вызовы recv (). Скорее всего, вам понадобится добавить небольшой заголовок к каждому пакету, чтобы сообщить получателю, сколько байтов отправляется, чтобы получатель мог выполнить цикл соответствующее число раз.
Я предлагаю вам взглянуть на руководство по сети Beej для получения более подробной информации о send () и recv () и о том, как решить эту проблему. Его можно найти на http://beej.us/guide/bgnet/output/print/bgnet_USLetter.pdf