sendfile函數的使用[通俗易懂]

sendfile函數的使用[通俗易懂]sendfile函數linux內核新加的函數,可以使得網絡傳輸文件時用户层无需分配缓冲区给将要传输的文件,从而能够节约内存,并直接调用系统调用#include<sys/sendfile.h>ssize_tsendfile(intout_fd,intin_fd,off_toffset,size_tcount);实例:#include<st…

大家好,又见面了,我是你们的朋友全栈君。

sendfile函數linux內核新加的函數,可以使得網絡傳輸文件時用户层无需分配缓冲区给将要传输的文件,从而能够节约内存,并直接调用系统调用

    #include <sys/sendfile.h>
    ssize_t sendfile(int out_fd,int in_fd,off_t offset,size_t count);

实例:

#include <stdio.h>
#include <sys/socket.h>
#include <sys/sendfile.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/stat.h>
#include <stdlib.h>

#define LISTENQ 100


int main(int argc,char** argv) {
    if (argc != 3) {
        printf("please add <port> <sendfile-name>\n");
        return -1;
    }
    int sockfd;
    if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0) {
        printf("socket error: %s\n",strerror(errno));
        return -1;
    }
    struct sockaddr_in server;
    bzero(&server,sizeof(server));
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = htonl(INADDR_ANY);
    server.sin_port = htons(atoi(argv[1]));
    if (bind(sockfd,(struct sockaddr*)&server,sizeof(server)) < 0) {
        printf("bind error: %s\n",strerror(errno));
        return -1;
    }
    if (listen(sockfd,LISTENQ) < 0) {
        printf("listen error: %s\n",strerror(errno));
        return -1;
    }
    int connfd;
    for (; ;) {
        if ((connfd = accept(sockfd,NULL,NULL)) < 0) {
            if (errno == EINTR) {
                continue;
            }
            printf("accept error: %s\n",strerror(errno));
            return -1;
        }
        struct stat file_stat;
        bool work = true;
        if (stat(argv[2],&file_stat) < 0) {
            printf("stat error: %s\n",strerror(errno));
            work = false;
        }
        if (S_ISREG(file_stat.st_mode)) {
            int fd;
            if ((fd = open(argv[2],O_RDONLY)) < 0) {
                printf("open error: %s\n",strerror(errno));
                return -1;
            }
            if (sendfile(connfd,fd,0,file_stat.st_size) != file_stat.st_size) {
                work = false;
                printf("sendfile error: %s\n",strerror(errno));
                return -1;
            }
            work = false;
            close(connfd);
            close(fd);
            continue;
        }
        if (!work) {
            char buf[100] = "Invalid request\n";
            if (write(connfd,buf,strlen(buf)) != strlen(buf)) {
                close(connfd);
                printf("write error: %s\n",strerror(errno));
                continue;
            }
            close(connfd);
        }   
    }
    return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/135647.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 放单平台_自媒体哪个平台好

    放单平台_自媒体哪个平台好Iamdoingaclustertest,whydidIencounterthelderrorwhencompilingtheseveralpackagesfrom/home/builder/master/master50/master_eXtremeDB_4.0.1780_linux/packs_x64.Theerrorinfoisbelow:ly@l…

    2022年10月15日
    3
  • 以太网PHY层芯片LAN8720A简介

    以太网PHY层芯片LAN8720A简介1、LAN8720A简介2、芯片管脚配置3、硬件电路

    2022年6月16日
    93
  • pip安装教程

    直接搜索pippip官网地址会得到下面的图像下载短的那个(如果你不知道pip是否安装可以通过命令pip–version来判断是否已安装)下载完成后解压到你自己知道的文件夹防止找不到,,然后有两种方法安装pip第一种在python环境下安装pippy-mensurepip–upgrade(直接在python里面运行cmd输入这一行代码)第二种可以用python中的内置脚本python内置脚本pyget-pip.py(下载到python文件中打开cmd,然后..

    2022年4月9日
    61
  • Python入门教程:Day11-文件和异常

    Python入门教程:Day11-文件和异常

    2021年7月4日
    113
  • shell循环控制sleep、continue、break

    shell循环控制sleep、continue、break循环控制语句sleepN脚本执行到该步休眠N秒continue跳过循环中的某次循环break跳出循环继续执行后续代码首先,要明确“break”与“continue”的区别:break:在for循环使用break,则跳出这个循环,循环命令结束continue:使用后,在当前循环终止命令,直接进入下个循环而break与countine都是作用于单个循环,如果想要进行多层循环操作,则需要在后面加数字,如break2和continue2。sleepN脚本执行到该步休眠N秒[ro

    2022年7月24日
    7
  • layui 弹出层和提交表单

    layui 弹出层和提交表单在点击修改按钮的时候,content路径CPTL/+curId ,路径中的curid是当前信息的ID,弹窗跳出当前的数据信息 2. 把提交的按钮写在子页面里面,这里没有用layui自带的yes:function(), 3….

    2022年6月12日
    81

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号