从特定点读取文件问题

Reading a file from a specific point problem

我正在使用 TCP server/client 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;
}

示例(外观应该如何):

这是个问题...

  1. 块 - This_

  2. 块 - is_a_

  3. 块 - 概率

  4. 块 - em...

这是我得到的:

  1. 块 - This_is_a

  2. 块 - is_a_概率

  3. 块 - 问题..

  4. 块 - em...

其中 _ 代表空白 space

根据您提到的评论,尝试以下代码。 我假设您正确计算了 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;
    }
}