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函数相关推荐

  1. Linux 零拷贝 sendfile函数中文说明及实际操作

    Sendfile函数说明  #include  ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count); sendfi ...

  2. 高级I/O函数之sendfile函数

    sendfile函数在两个文件描述符之间传递数据(完全在内核中操作),从而避免了内核缓冲区和用户缓冲区之间的数据拷贝,效率很高,被称为零拷贝.函数定义为: #include<sys/sendfi ...

  3. 2022-4-16 sendfile函数的使用《Linux服务器》笔记 ——【为啥发了两次啊?】

    客户端代码 //tcp 通信客户端 #include<stdio.h> #include<arpa/inet.h> #include<stdlib.h> #incl ...

  4. linux 高级IO函数之sendfile splice tee

    sendfile函数在两个文件描述符之间传递数据(完全在内核中操作),从而避免内核缓冲区和用户缓冲区之间的数据拷贝,效率很高,这被称为零拷贝.函数的定义如下: #include<sys/send ...

  5. 使用sendfile()让数据传输得到最优化,TCP_CORK、TCP_DEFER_ACCEPT和TCP_QUICKACK优化网络...

    当今国互联网的飞速发展让人们获益匪浅,同时人们对于互联网 的期望值也变得越来越高.这就形成了一个矛盾,虽然互联网的 发展已经是相当迅猛的了,但是人们还是期望从服务器到客户终 端的文件传输的速度能够比现 ...

  6. linux存储--mmap与sendfile(十七)

    零拷贝这三个字,一直是服务器网络编程的关键字,任何性能优化都离不开.在 Java 程序员的世界,常用的零拷贝有 mmap 和 sendFile.那么,他们在 OS 里,到底是怎么样的一个的设计?本文将 ...

  7. 【Netty】mmap 和 sendFile 零拷贝原理

    文章目录 一. 零拷贝 简介 二. 传统 BIO 数据拷贝分析 ( 4拷贝 4切换 ) 三. mmap 内存映射 ( 3拷贝 4切换 ) 四. sendFile 函数 ( Linux 2.1 优化 ) ...

  8. Linux高性能server编程——高级I/O函数

     高级I/O函数 pipe函数 pipe函数用于创建一个管道,实现进程间的通信. #include <unistd.h> int pipe(int pipefd[2]); 通过pipe ...

  9. Linux网络编程 | 零拷贝 :sendfile、mmap、splice、tee

    文章目录 传统文件传输的问题 Linux中实现零拷贝的方法 传统文件传输的问题 在网络编程中,如果我们想要提供文件传输的功能,最简单的方法就是用read将数据从磁盘上的文件中读取出来,再将其用writ ...

最新文章

  1. 程序员头发失踪之谜 | 每日趣闻
  2. mysql优化篇_MySQL优化篇-查询优化
  3. spring+springmvc+ibatis整合小结
  4. zkcli远程连接_ZooKeeper 学习笔记(二)-API 操作和应用
  5. 如何突破瓶颈又释放工作量? 深度剖析《闪耀暖暖》游戏从2D到3D的美术开发过程
  6. 【数据结构与算法】之深入解析“把二叉搜索树转换为累加树”和“从二叉搜索树到更大和树”的求解思路与算法示例
  7. Outlook2016未读邮件怎么设置字体颜色
  8. 【Windows Phone设计与用户体验】关于移动产品的Loading用户体验的思考
  9. 使用 matlab 进行正太拟合
  10. 如何用计算机画磁滞回线,[画图的问题]怎么画类似于磁滞回线的图像?一个x值对应两个y值的...
  11. log4j2自定义过滤器_Log4j级别示例–订单,优先级,自定义过滤器
  12. MVC登陆认证简单设置
  13. 天大18春在线考试计算机答案,天津大学期末考核18春学期《画法几何及工程制图》在线作业一全套习题答案...
  14. Android7.0 MessageQueue
  15. 微信抽奖网络服务器错误,微信抽奖账号异常原因?
  16. window下isa防火墙详细安装
  17. 利用AcrGIS计算核密度中某一等级的面积
  18. 兼容IE浏览器下载文件
  19. vue + element-ui 实现分页功能
  20. ubuntu 18.04中的shutter无法编辑截图

热门文章

  1. 国家发改委:利用区块链等新技术开展绿色电力交易试点
  2. C#编程-36:数组与ArrayList基础复习_彭世瑜_新浪博客
  3. settings.gradle.kts里读取properties配置文件或者解析json文件
  4. msmtp详细安装及使用
  5. 基于SSM的自习室预订座位占座管理系统-JAVA.VUE【计算机毕设、网页开发、论文、源码、开题报告】
  6. 阿里云文件上传与删除
  7. 灯塔工厂PLC智慧边缘计算机嵌入式linux系统
  8. Latex | Latex 公式对齐
  9. php mysql 嵌套查询_select 嵌套查询
  10. 谈谈供应商管理的策略与方法