При отправке огромных файлов становится равным максимальному значению size_t, я думаю, что у меня переполнение буфера.
Поскольку sent
получает свое значение в качестве возвращаемого значения send()
, а send()
возвращает ssize_t
, что является типом со знаком, который вряд ли будет шире, чем size_t
. Фактически очевидно, что в действительности send()
указывает на ошибку, возвращая -1.В этом случае также будет установлено значение errno
, указывающее на ошибку.Он не может вернуть максимальное значение size_t
в любой системе, в которой у меня когда-либо были руки.
Как я могу предотвратить это?
Во-первыхпрежде чем беспокоиться о предотвращении этого, вы должны обязательно обнаружить его по
- , объявив
sent
как ssize_t
в соответствии с возвращаемым значениемтип send()
, а не size_t
и - , проверяющий значение, возвращенное в
sent
для таких условий ошибки.
Во-вторых, если вы действительно имеете дело с файламидольше, чем может быть представлено ssize_t
(намного меньше size_t
), тогда плохая идея загрузить все это в память перед отправкой любого из них.Вместо этого загрузите его в (гораздо) меньшие блоки и отправляйте данные по одному такому блоку за раз.Это не только приведет к снижению воспринимаемой задержки, но и позволит избежать любого риска, связанного с приближением к пределам используемых типов данных.
Кроме того, при этом соблюдайте осторожность, чтобы сделать это правильно.Вы преуспели в том, чтобы обернуть свой вызов send()
в цикл для учета коротких записей, но, как описывает @Artyer в своем ответе, вы не совсем понимаете это правильно, потому что не уменьшаете количество байтов, которые вы пытаетесь отправитьна второй и последующие вызовы.
Как лучше прочитать файл и отправить его обратно?
Как указано выше.