发送带有sendfile的文件很容易:
stat(fd,&filestat);
sendfile(sockfd,fd,0,filestat.len)但是如何使用sendfile接收文件呢?由于我不知道文件的长度,应该先发送文件长度吗?
sendfile(fd, sockfd,0, ??)似乎有两种方法可以做到这一点:
哪一个更好?我应该专门处理缓冲区长度吗?当文件相当大时,第一种方式有问题吗?
(我非常喜欢sendfile的mac os版本,如果计数为0,它会一直发送到文件的末尾)。
发布于 2013-11-27 07:26:28
这是个很棒的问题!
其他海报是正确的:你可以叫读()或recv() (有什么不同??)重复执行,直到其中任何一个返回0,这表示文件结束(EOF)。
不过!您应该考虑首先传递文件的大小,作为一种良好的做法。这将使您的客户端能够准确地预测有多少数据通过套接字,找出(例如)是否有足够的磁盘空间等等。它允许您在承诺下载服务器试图发送的任何内容之前进行某种类型的正常检查。
(这有它自己的危险。如果服务器发送的大小不对怎么办?)
您还可以考虑以块的形式发送文件。这样,如果有一个中断,您有一个更大的粒度,当计算出您已经转移了多少。(不管怎么说,内核都是为您做的。但却是思想的食粮。
通过网络发送单个整数(文件大小)并不是太难,但是如果您非常担心可移植性,则需要注意一些戏法。
祝好运!
发布于 2013-11-27 07:12:49
按手册到sendfile()
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的结果。
发布于 2019-08-10 07:45:09
我想使用sendfile从套接字fd接收文件是不可能的,因为根据手册页:
in_fd参数必须对应于支持mmap(2)-like操作的文件(也就是说,它不能是套接字)。
我试过使用它,但得到了一个错误的Illegal seek
如果有人感兴趣,我可以张贴我的代码片段。
https://stackoverflow.com/questions/20235843
复制相似问题