通过套接字发送的二进制文件已损坏

时间:2012-10-16 10:57:13

标签: sockets tcp header send recv

我正在做一个代码,它将在两台计算机之间传输文件。我正在使用tcp socket进行连接。问题是我需要将一些标题附加到我正在发送的文件字节中,以便接收方知道我发送的是文件的一部分。假设我的标题为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);
}

但是我已经尝试发送没有标题的文件而且文件没有损坏但是我需要为这个特定的代码使用那些“数据”标题。我做错了什么?

1 个答案:

答案 0 :(得分:2)

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

但您在每次data<space>来电时都没有收到receive()标头。您必须保留一个缓冲区,您可以将所有数据添加到该缓冲区,直到遇到另一个"data<space>"

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

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