Чтение файла с конкретной проблемы - PullRequest
0 голосов
/ 21 декабря 2018

Я использую приложение 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;
}

Пример (как это должно выглядеть):

Это проблема ...

  1. чанк - This_

  2. чанк - is_a_

  3. чанк- пробл

  4. чанк - эм ...

И вот что я получаю:

  1. чанк - This_is_a

  2. чанк - is_a_prob

  3. чанк - проблема ..

  4. чанк -em ...

где _ представляет пробел

1 Ответ

0 голосов
/ 21 декабря 2018

Из комментариев, которые вы упомянули, попробуйте следующий код.Я предполагаю, что вы правильно рассчитали переменную 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;
    }
}
...