Чтение файла с конкретной проблемы
Я использую приложение TCP сервер / клиент C для отправки файла с сервера на клиент. Файл должен быть отправлен по частям (одна часть на одно соединение). Я успешно отправляю файл с сервера на клиент, это не проблема. Проблема в том, что одна часть на соединение получает правильную часть для отправки. Я использую 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
кусок - проблема..
кусок - эм...
где _ представляет пустое пространство
1 ответ
Из упомянутых вами комментариев попробуйте следующий код. Я предполагаю, что вы правильно рассчитали переменную leftToSend.
while((leftToSend >= 0) || feof(filePtr))
{
cFromFile = fgetc(filePtr);
dataBuffer[i] = cFromFile;
i++;
leftToSend--;
if ((i >= (BUFFER_SIZE - 1)) || (0 == leftToSend) || (i >= (SEND_DENOM + 1)))
{
// Send message to client
iResult = sendto(clientSocket,
dataBuffer,
i,
0,
(SOCKADDR *)&clientAddress,
sizeof(clientAddress));
if (SOCKET_ERROR == iResult)
{
printf("sendto failed with error: %d\n", WSAGetLastError());
closesocket(clientSocket);
WSACleanup();
ExitThread(100);
}
// Set whole buffer to zero
memset(dataBuffer, 0, BUFFER_SIZE);
bytesSent += i;
i = 0;
}
}