我在做一个在两台计算机之间传输文件的代码。我使用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);
}但是我尝试过在没有头文件的情况下发送文件,并且文件没有损坏,但是我需要在这段特定的代码中使用那些“数据”头。我做错了什么?
发布于 2012-10-16 12:03:51
fp = fp + 5;//我这样做是为了跳过“data”报头
但是,并不是在每个data<space>调用中都接收到receive()头。您必须保留一个缓冲区,将接收到的所有数据添加到其中,直到遇到另一个"data<space>"为止。
不过,请注意,分隔符通常是一个不好的主意。如果您发送一个包含字符串"data<space>"的文件,该怎么办?您的客户端将假设在此之后,将发送一个新文件,而实际上您仍在接收原始文件。
尝试发送某种类型的消息长度-标头,例如uint32,它在发送每个文件之前占据四个字节。然后,您可以读取前四个字节,然后知道该文件还需要多少字节。
https://stackoverflow.com/questions/12913160
复制相似问题