代码拉取完成,页面将自动刷新
#include "client.h"
int recvFile(int sockfd, int len){
// 接收文件名
char fileName[128] = { 0 };
recvn(sockfd, fileName, len);
// 接收(剩余)文件大小
off_t leftSize;
recvn(sockfd, &leftSize, sizeof(leftSize));
printf("leftSize = %ld\n", leftSize);
//int fd = open(fileName, O_RDWR | O_APPEND | O_CREAT, 0644);
int fd = open(fileName, O_RDWR | O_CREAT, 0644);
if (fd == -1){
close(sockfd);
error(1, errno, "open");
}
off_t offset = lseek(fd, 0, SEEK_END);
off_t fileSize = offset + leftSize;
int pipefds[2];
pipe(pipefds);
off_t slice = fileSize / 100;
off_t currSize = offset;
off_t lastSize = offset;
while (currSize < fileSize){
int bytes = splice(sockfd, NULL, pipefds[1], NULL, 4096, SPLICE_F_MORE);
if (bytes == 0) break;
bytes = splice(pipefds[0], NULL, fd, NULL, bytes, SPLICE_F_MORE);
currSize += bytes;
if (currSize - lastSize >= slice){
printf("recv %5.2lf%%\r", (double)currSize / fileSize * 100);
fflush(stdout);
lastSize = currSize;
}
}
printf("recv 100.00%%\n\n");
close(fd);
return 0;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。