首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过套接字发送的二进制文件已损坏。

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

Stack Overflow用户
提问于 2012-10-16 10:57:13
回答 1查看 1.1K关注 0票数 0

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

我能够发送它们,接收者也能够接收它们,但是文件似乎被破坏了。虽然对于未格式化的文本文件,它工作得很好,但是对于其他文件,它似乎不能有效地解析文件。

代码语言:javascript
复制
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);
}

但是我尝试过在没有头文件的情况下发送文件,并且文件没有损坏,但是我需要在这段特定的代码中使用那些“数据”头。我做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2012-10-16 12:03:51

fp = fp + 5;//我这样做是为了跳过“data”报头

但是,并不是在每个data<space>调用中都接收到receive()头。您必须保留一个缓冲区,将接收到的所有数据添加到其中,直到遇到另一个"data<space>"为止。

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12913160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档