首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用sendfile接收文件?

如何使用sendfile接收文件?
EN

Stack Overflow用户
提问于 2013-11-27 06:56:43
回答 4查看 5.7K关注 0票数 6

发送带有sendfile的文件很容易:

代码语言:javascript
复制
stat(fd,&filestat);
sendfile(sockfd,fd,0,filestat.len)

但是如何使用sendfile接收文件呢?由于我不知道文件的长度,应该先发送文件长度吗?

代码语言:javascript
复制
 sendfile(fd, sockfd,0, ??)

似乎有两种方法可以做到这一点:

  1. 首先发送filestat.len //发送端写( sockfd,filestat.len);sendfile(sockfd,fd,&偏移量,filestat.len);//接收端读(sockfd,& len);sendfile(fd,sockfd,&偏移,len)
  2. 在接收端使用循环: //接收结束时(sendfile(fd,sockfd,& BUF_LEN) > 0) {偏移量+= BUF_LEN;}

哪一个更好?我应该专门处理缓冲区长度吗?当文件相当大时,第一种方式有问题吗?

(我非常喜欢sendfile的mac os版本,如果计数为0,它会一直发送到文件的末尾)。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-11-27 07:26:28

这是个很棒的问题!

其他海报是正确的:你可以叫读()recv() (有什么不同??)重复执行,直到其中任何一个返回0,这表示文件结束(EOF)。

不过!您应该考虑首先传递文件的大小,作为一种良好的做法。这将使您的客户端能够准确地预测有多少数据通过套接字,找出(例如)是否有足够的磁盘空间等等。它允许您在承诺下载服务器试图发送的任何内容之前进行某种类型的正常检查。

(这有它自己的危险。如果服务器发送的大小不对怎么办?)

您还可以考虑以块的形式发送文件。这样,如果有一个中断,您有一个更大的粒度,当计算出您已经转移了多少。(不管怎么说,内核都是为您做的。但却是思想的食粮。

通过网络发送单个整数(文件大小)并不是太,但是如果您非常担心可移植性,则需要注意一些戏法

祝好运!

票数 4
EN

Stack Overflow用户

发布于 2013-11-27 07:12:49

按手册到sendfile()

代码语言:javascript
复制
RETURN VALUE
       If  the  transfer was successful, the number of bytes written to out_fd
       is returned.  On error, -1 is returned, and errno is set appropriately.

因此,只需以一种对套接字使用read()的方式使用它:重复读取所需的内容,直到读取所需的全部数据为止。当然,注意-1和0的结果。

票数 1
EN

Stack Overflow用户

发布于 2019-08-10 07:45:09

我想使用sendfile从套接字fd接收文件是不可能的,因为根据手册页:

in_fd参数必须对应于支持mmap(2)-like操作的文件(也就是说,它不能是套接字)。

我试过使用它,但得到了一个错误的Illegal seek

如果有人感兴趣,我可以张贴我的代码片段。

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

https://stackoverflow.com/questions/20235843

复制
相关文章

相似问题

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