如何使用sendfile接收文件?
使用sendfile发送文件很简单:
stat(fd,&filestat); sendfile(sockfd,fd,filestat.len) 但是如何使用sendfile接收文件?因为我不知道文件的长度,我应该先发送文件长度吗? sendfile(fd,sockfd,??) 似乎有两种方法可以做到这一点: >首先发送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. 祝好运! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |