从特定点读取文件

时间:2018-12-20 23:05:02

标签: c tcp tcpclient tcpserver

我正在使用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;
}

示例(外观如何):

这是一个问题...

  1. 块-This _

  2. 块-is_a _

  3. 块-问题

  4. 块-em ...

这是我得到的:

  1. 块-This_is_a

  2. 块-is_a_prob

  3. 大块-问题。.

  4. 块-em ...

其中_代表空格

1 个答案:

答案 0 :(得分:0)

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