以下代码继续在同一个文件中接收数据(“/ tmp / frame”), 当真正的目的是在单独的文件中接收。 似乎服务器开始接收文件并且没有关闭,继续接收相同的以下文件的数据。
(代码中的注释解决了问题,但延迟了文件的传输)
发件人:
datetime
接收器:
screenshot ptr_screen;
CHAR Block[4096], buffer[512];
int BytesRead, iResult;
for (;;) {
memset(Block, 0, sizeof(Block));
memset(buffer, 0, sizeof(buffer));
ptr_screen.Start();
FILE *fp = fopen("screen.jpg", "rb");
if (!fp) { break; }
fseek(fp, 0, SEEK_END);
int32_t file_size = ftell(fp);
fseek(fp, 0, SEEK_SET);
iResult = send(socket_, (char*)&file_size, sizeof(file_size), 0);
if (iResult == SOCKET_ERROR) { fclose(fp); break; }
while (file_size > 0) {
BytesRead = fread(Block, 1, sizeof(Block), fp);
if (BytesRead <= 0) { break; }
iResult = send(socket_, Block, BytesRead, 0);
if (iResult != BytesRead) { break; }
file_size -= BytesRead;
}
fflush(fp);
fclose(fp);
//if (recv_to(socket_, buffer, sizeof(buffer), 0, 5000) <= 0)
//break;
}
答案 0 :(得分:2)
TCP是一种流协议。接收方通常不会接收分解为与发送方发送方式相同的块的数据 - 您将获得基本上任意分解的块。
特别是,当发件人发送最后一个文件时,然后立即从新文件发送大小和第一个块,接收器完全有可能收到最后一个块,大小和部分下一个文件的第一个块,在一个块中汇总在一起。 file_size
将变为负数,这将使你一次性退出内循环。但是,您将从下一个文件的中间读入file_size
一些随机数据。它可能恰好形成一个非常大的整数,这就是你的内循环似乎不再退出的原因。
在内部循环中读取max(sizeof(Block), file_size)
个字节,因此不要超过文件边界。