Для всех тех людей, которые говорят, что используют TCP .... глупо неправильно. Хотя протокол TCP надежен и окно, поддерживаемое ядром, является протоколом «установил и забыл», но когда дело доходит до парня, желающего использовать 100% своей пропускной способности, TCP не подойдет (он слишком сильно душит, и ожидание ACK автоматически помещает как минимум 50% мусора из-за RTT).
К первоначальному вопросу, вы отправляете UDP-пакеты без остановки в этом цикле for, окно заполняется, а затем любые новые данные удаляются немедленно и даже не пытаются выйти на линию. Вы также разделяете свои данные слишком большими. Я бы порекомендовал создать свой собственный механизм дроссельной заслонки, который начинается с 2 тыс. Сегментов в секунду и медленно развивается. Каждый «сегмент» содержит SEQ (идентификатор последовательности для подтверждений или ACK) и OFF (смещение внутри файла для этого набора данных). Поскольку данные помечаются, пусть сервер отслеживает эти теги. Когда другая сторона получает их, она сохраняет номера SEQ в списке ACK, и все отсутствующие номера SEQ помещаются в список таймера NACK, когда таймер заканчивается (если они не были получены), он перемещается в список NACK. , Приемник должен отправлять около 5 ACK из списка ACK вместе с 5 NACK в одной передаче каждые пару секунд или около того. Если отправитель получает эти сообщения и имеются какие-либо NACK, он должен немедленно уменьшить скорость и повторно отправить отсутствующий фрагмент, прежде чем продолжить. Данные, которые подтверждены ACK, могут быть освобождены из памяти.
Удачи!