0

我正在做一个将在两台计算机之间传输文件的代码。我正在使用 tcp 套接字进行连接。问题是我需要将某种标头附加到我正在发送的文件字节中,以便接收者知道我正在发送的内容是文件的一部分。假设我的标题是data. 我将发送的字符串是:data <file bytes>.

我能够发送它们并且接收者能够接收它们,但文件似乎已损坏。尽管对于未格式化的文本文件,它运行良好,但对于其他文件,它似乎不能有效地解析文件。

while(1){
    fp = (char*) malloc (56);
    rc = recv(connfd,fp,55,0);

    if(strcmp(fp,"stop") == 0){
        break;
    }

    fp = fp + 5; //I do this to skip the 'data<space>" header
    wr = write(fd,pf2,rc-5);
    tot = tot + wr;
    printf("Received a total of %d bytes rc = %d \n",tot, rc);
}

但是我尝试发送不带标头的文件并且我得到了未损坏的文件,但我需要为这个特定的代码使用那些“数据”标头。我究竟做错了什么?

4

1 回答 1

2
fp = fp + 5; //I do this to skip the 'data<space>" header

但是您不会data<space>在每次receive()通话中都收到标头。您必须保留一个缓冲区,将收到的所有数据添加到该缓冲区中,直到遇到另一个"data<space>".

请注意,分隔符通常不是一个好主意。如果您发送一个包含字符串的文件"data<space>"怎么办?您的客户会假设在那之后会发送一个新文件,而实际上您仍在接收原始文件。

尝试发送某种消息长度标头,例如 uint32,它在您发送的每个文件之前占用四个字节。然后,您可以读取前四个字节,然后您就知道该文件还可以预期多少字节。

于 2012-10-16T12:03:51.847 回答