Linux   发布时间:2022-03-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何使用sendfile接收文件?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

使用sendfile发送文件很简单: stat(fd,&filestat); sendfile(sockfd,fd,0,filestat.len) 但是如何使用sendfile接收文件?因为我不知道文件的长度,我应该先发送文件长度吗? sendfile(fd, sockfd,0, ??) 似乎有两种方法可以做到这一点: >首先发送filestat.len //send end write(sock
使用sendfile发送文件很简单:

stat(fd,&filestat);
sendfile(sockfd,fd,filestat.len)

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

sendfile(fd,sockfd,??)

似乎有两种@L_197_4@可以做到这一点:

>首先发送filestat.len

//send end
write(sockfd,filestat.len);
sendfile(sockfd,&offset,filestat.len);
//receive end
read(sockfd,&len);
sendfile(fd,len)

>在接收端使用循环:

//receive end
while(sendfile(fd,BUF_LEN) > 0) {
    offset += BUF_LEN;
}

一个更好?我应该具体处理缓冲区长度吗?
文件很大时,第一种方式有问题吗?

(我真的很喜欢sendfile的mac os版本,如果count为0,它将发送到文件末尾)

解决方法

这是一个很好的问题!

其他海报是正确的:您可以反复调用read()recv()(what is the difference?),直到其中任何一个返回0,这表示文件结束(EOF).

然而!您应该虑首先传递文件的大小,这是一种很好的做法.这将允许您的客户端准确预测通过套接字传输的数据量,确定(例如)是否有足够的磁盘空间等.它允许您在承诺下载任何服务器之前进行某种健全性检查试图发送.

(这有其自身的危险.如果服务器发送错误的大小怎么办?)

您也可以虑以块的形式发送文件.这样,如果存在中断,则在计算出已转移的数量时,您会有更大的粒度. (无论如何,内核都会为你做这件事.但值得深思.)

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

祝好运!

大佬总结

以上是大佬教程为你收集整理的如何使用sendfile接收文件?全部内容,希望文章能够帮你解决如何使用sendfile接收文件?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。