我正在使用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 _
块-问题
块-em ...
这是我得到的:
块-This_is_a
块-is_a_prob
大块-问题。.
块-em ...
其中_代表空格
答案 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;
}
}