文件继续在套接字传输中接收无限数据

时间:2016-10-22 02:11:43

标签: c++ sockets

以下代码继续在同一个文件中接收数据(“/ 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;
}

1 个答案:

答案 0 :(得分:2)

TCP是一种流协议。接收方通常不会接收分解为与发送方发送方式相同的块的数据 - 您将获得基本上任意分解的块。

特别是,当发件人发送最后一个文件时,然后立即从新文件发送大小和第一个块,接收器完全有可能收到最后一个块,大小和部分下一个文件的第一个块,在一个块中汇总在一起。 file_size将变为负数,这将使你一次性退出内循环。但是,您将从下一个文件的中间读入file_size一些随机数据。它可能恰好形成一个非常大的整数,这就是你的内循环似乎不再退出的原因。

在内部循环中读取max(sizeof(Block), file_size)个字节,因此不要超过文件边界。