Что-то вроде:
#define CHUNK_SIZE 512
char file_data[CHUNK_SIZE];
//or
char *file_data = malloc(CHUNK_SIZE);
size_t nbytes = 0;
while ( (nbytes = fread(file_data, sizeof(char), CHUNK_SIZE)) > 0)
{
sent = send(client, file_data, nbytes, 0);
}
Но вам также нужно отправить данные порциями, и вы не можете предполагать, что вы отправите все это за один вызов.
Чтобы send()
выглядело так:
int offset = 0;
while ((sent = send(client, file_data + offset, nbytes, 0)) > 0) {
offset += sent;
nbytes -= sent;
}
И тогда вы должны быть готовы обрабатывать прерывания во время вызова send () (в этом случае вам просто нужноповторить отправку из той же позиции):
int offset = 0;
while ((sent = send(client, file_data + offset, nbytes, 0)) > 0
|| (sent == -1 && errno == EINTR) ) {
if (sent > 0) {
offset += sent;
nbytes -= sent;
}
}
В (возможно, редком) случае EINTR, send будет повторяться на следующей итерации цикла и, вероятно, будет иметьшанс завершить в следующий раз и вернуть данные в вашу программу