Я использую приложение C сервер TCP / клиент для отправки файла с сервера на клиент.Файл должен быть отправлен по частям (одна часть на одно соединение).Я успешно отправляю файл с сервера на клиент, это не проблема.Проблема в том, что одна часть на соединение получает правильную часть для отправки.Я использую fseek (), чтобы найти размер всего файла и разделить его на 4. Это размер фрагмента, который я хочу отправить клиенту.Проблема остается, потому что я получаю больше порции, чем на самом деле ожидаю.
// Retrieve file size
fSize = fileSize(filePtr);
// How much bytes to send
if (fSize >= 4)
{
leftToSend = fSize / SEND_DENOM;
}
else
{
leftToSend = fSize;
}
int fpOffset = leftToSend * (partToSend - 1);
fseek(filePtr, fpOffset, SEEK_SET);
int i = 0;
char cFromFile;
while(leftToSend != 0 || feof(filePtr))
{
cFromFile = fgetc(filePtr);
dataBuffer[i++] = cFromFile;
leftToSend--;
bytesSent++;
if (strlen(dataBuffer) == (BUFFER_SIZE - 1) || leftToSend == 0)
{
// Send message to client
iResult = sendto(clientSocket,
dataBuffer,
strlen(dataBuffer),
0,
(SOCKADDR *)&clientAddress,
sizeof(clientAddress));
if (iResult == SOCKET_ERROR)
{
printf("sendto failed with error: %d\n", WSAGetLastError());
closesocket(clientSocket);
WSACleanup();
ExitThread(100);
}
// Set whole buffer to zero
memset(dataBuffer, 0, BUFFER_SIZE);
i = 0;
}
}
Функция поиска размера файла:
unsigned long long int fileSize (FILE* filePtr)
{
unsigned long long int fSize = 0;
fseek(filePtr, 0, SEEK_END);
fSize = ftell(filePtr);
rewind(filePtr);
return fSize;
}
Пример (как это должно выглядеть):
Это проблема ...
чанк - This_
чанк - is_a_
чанк- пробл
чанк - эм ...
И вот что я получаю:
чанк - This_is_a
чанк - is_a_prob
чанк - проблема ..
чанк -em ...
где _ представляет пробел