sendfile函数
sendfile函数:
函数原型:
#include <sys/sendfile.h>
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
sendfile在两个文件描述符之间直接传输数据(完全在内核中操作),从而避免了内核缓冲区和用户缓冲区之间拷贝数据,效率很高,这被称为零拷贝.
out_fd: 待写入数据的文件描述符
in_fd:待读出数据的文件描述符
offset:指定从读入文件流的哪个位置开始读书据,如果为空,则采用默认的读入文件其起始位置
count:指定在in_fd 和out_fd 之间传输的数据字节数
函数返回值:成功传输的字节数
注意:
in_fd 必须是真实存在的文件,不能是socket和管道
out_fd 必须是一个socket.
测试代码:
#define _GNU_SOURCE /* See feature_test_macros(7) */
#include<sys/types.h>
#include<sys/stat.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<assert.h>
#include<stdio.h>
#include<errno.h>
#include<unistd.h>
#include<string.h>
#include<fcntl.h>
#include<stdlib.h>
#include<sys/epoll.h>
#include<pthread.h>
#include<libgen.h>
ser.c文件:
#include"../utili.h"
int main(int argc,char *argv[])
{
if(argc<=3)
{
printf("usage: %s ip port_number\n",basename(argv[0]));
return 1;
}
const char*ip = argv[1];
int port = atoi(argv[2]);
const char *file_name = argv[3];
int filefd = open(file_name,O_RDONLY);
assert(filefd>0);
struct stat stat_buf;
fstat(filefd,&stat_buf);
struct sockaddr_in address;
bzero(&address,sizeof(address));
address.sin_family = AF_INET;
address.sin_port = htons(port);
inet_pton(AF_INET,ip,&address.sin_addr);
int sock = socket(AF_INET,SOCK_STREAM,0);
assert(sock>=0);
socklen_t len = sizeof(address);
int ret = bind(sock,(struct sockaddr*)&address,len);
assert(ret!=-1);
ret = listen(sock,5);
assert(ret!=-1);
struct sockaddr_in client;
socklen_t client_len = sizeof(client);
int connfd = accept(sock,(struct sockaddr*)&client,&client_len);
if(connfd<0)
{
printf("errno: %d\n",errno);
}
else
{
sendfile(connfd,filefd,NULL,stat_buf.st_size);
close(connfd);
}
close(sock);
return 0;
}
cli.c文件:
#include"../utili.h"
int main(int argc,char *argv[])
{
const char *ip = argv[1];
int port = atoi(argv[2]);
struct sockaddr_in addrSer;
bzero(&addrSer,sizeof(addrSer));
addrSer.sin_family = AF_INET;
addrSer.sin_port = htons(port);
inet_pton(AF_INET,ip ,&addrSer.sin_addr);
int sock = socket(AF_INET,SOCK_STREAM,0);
assert(sock>=0);
int ret = connect(sock,(struct sockaddr*)&addrSer,sizeof(addrSer));
assert(ret>=0);
char buf[50];
while(1)
{
ret = recv(sock,buf,50,0);
if(ret<0)
break;
else if(ret == 0)
{
printf("sever close connextion\n");
break;
}
else
printf("get %d bytes : %s\n",(int)strlen(buf),buf);
}
close(sock);
}
sendfile函数相关推荐
- Linux 零拷贝 sendfile函数中文说明及实际操作
Sendfile函数说明 #include ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count); sendfi ...
- 高级I/O函数之sendfile函数
sendfile函数在两个文件描述符之间传递数据(完全在内核中操作),从而避免了内核缓冲区和用户缓冲区之间的数据拷贝,效率很高,被称为零拷贝.函数定义为: #include<sys/sendfi ...
- 2022-4-16 sendfile函数的使用《Linux服务器》笔记 ——【为啥发了两次啊?】
客户端代码 //tcp 通信客户端 #include<stdio.h> #include<arpa/inet.h> #include<stdlib.h> #incl ...
- linux 高级IO函数之sendfile splice tee
sendfile函数在两个文件描述符之间传递数据(完全在内核中操作),从而避免内核缓冲区和用户缓冲区之间的数据拷贝,效率很高,这被称为零拷贝.函数的定义如下: #include<sys/send ...
- 使用sendfile()让数据传输得到最优化,TCP_CORK、TCP_DEFER_ACCEPT和TCP_QUICKACK优化网络...
当今国互联网的飞速发展让人们获益匪浅,同时人们对于互联网 的期望值也变得越来越高.这就形成了一个矛盾,虽然互联网的 发展已经是相当迅猛的了,但是人们还是期望从服务器到客户终 端的文件传输的速度能够比现 ...
- linux存储--mmap与sendfile(十七)
零拷贝这三个字,一直是服务器网络编程的关键字,任何性能优化都离不开.在 Java 程序员的世界,常用的零拷贝有 mmap 和 sendFile.那么,他们在 OS 里,到底是怎么样的一个的设计?本文将 ...
- 【Netty】mmap 和 sendFile 零拷贝原理
文章目录 一. 零拷贝 简介 二. 传统 BIO 数据拷贝分析 ( 4拷贝 4切换 ) 三. mmap 内存映射 ( 3拷贝 4切换 ) 四. sendFile 函数 ( Linux 2.1 优化 ) ...
- Linux高性能server编程——高级I/O函数
高级I/O函数 pipe函数 pipe函数用于创建一个管道,实现进程间的通信. #include <unistd.h> int pipe(int pipefd[2]); 通过pipe ...
- Linux网络编程 | 零拷贝 :sendfile、mmap、splice、tee
文章目录 传统文件传输的问题 Linux中实现零拷贝的方法 传统文件传输的问题 在网络编程中,如果我们想要提供文件传输的功能,最简单的方法就是用read将数据从磁盘上的文件中读取出来,再将其用writ ...
最新文章
- 程序员头发失踪之谜 | 每日趣闻
- mysql优化篇_MySQL优化篇-查询优化
- spring+springmvc+ibatis整合小结
- zkcli远程连接_ZooKeeper 学习笔记(二)-API 操作和应用
- 如何突破瓶颈又释放工作量? 深度剖析《闪耀暖暖》游戏从2D到3D的美术开发过程
- 【数据结构与算法】之深入解析“把二叉搜索树转换为累加树”和“从二叉搜索树到更大和树”的求解思路与算法示例
- Outlook2016未读邮件怎么设置字体颜色
- 【Windows Phone设计与用户体验】关于移动产品的Loading用户体验的思考
- 使用 matlab 进行正太拟合
- 如何用计算机画磁滞回线,[画图的问题]怎么画类似于磁滞回线的图像?一个x值对应两个y值的...
- log4j2自定义过滤器_Log4j级别示例–订单,优先级,自定义过滤器
- MVC登陆认证简单设置
- 天大18春在线考试计算机答案,天津大学期末考核18春学期《画法几何及工程制图》在线作业一全套习题答案...
- Android7.0 MessageQueue
- 微信抽奖网络服务器错误,微信抽奖账号异常原因?
- window下isa防火墙详细安装
- 利用AcrGIS计算核密度中某一等级的面积
- 兼容IE浏览器下载文件
- vue + element-ui 实现分页功能
- ubuntu 18.04中的shutter无法编辑截图
热门文章
- 国家发改委:利用区块链等新技术开展绿色电力交易试点
- C#编程-36:数组与ArrayList基础复习_彭世瑜_新浪博客
- settings.gradle.kts里读取properties配置文件或者解析json文件
- msmtp详细安装及使用
- 基于SSM的自习室预订座位占座管理系统-JAVA.VUE【计算机毕设、网页开发、论文、源码、开题报告】
- 阿里云文件上传与删除
- 灯塔工厂PLC智慧边缘计算机嵌入式linux系统
- Latex | Latex 公式对齐
- php mysql 嵌套查询_select 嵌套查询
- 谈谈供应商管理的策略与方法