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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • selenium webdriver下载_webdriver怎么读

    selenium webdriver下载_webdriver怎么读地址:http://npm.taobao.org/mirrors/chromedriver/下载完对应的webdriver后,放到python目录下的Scripts文件夹内测试示例:fromseleniumimportwebdriver#测试用例1driver=webdriver.Chrome()如果能够打开浏览器就表示成功,如果报错Thisversiono…

    2022年9月19日
    3
  • mysql开启慢日志查询_MySQL慢sql检验生效

    mysql开启慢日志查询_MySQL慢sql检验生效MySQL给我们提供了一个很好的功能,那就是慢查询!所谓的慢查询就是通过设置来记录超过一定时间的SQL语句!那么如何应用慢查询呢?1.开启MySQL的慢查询日志功能默认情况下,MySQL是不会记录超过一定执行时间的SQL语句的。要开启这个功能,我们需要修改MySQL的配置文件:windows下修改my.ini,(注册表,计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentCo…

    2022年10月14日
    0
  • 一维卷积神经网络处理序列模型

    一维卷积神经网络处理序列模型fromkeras.datasetsimportimdbfromkeras.modelsimportSequentialfromkeras.layersimportEmbedding,Conv1D,MaxPooling1D,GlobalMaxPooling1D,Densefromkeras.optimizersimportRMSpropmax_featu…

    2022年9月22日
    0
  • 2021.9idea激活码永久【最新永久激活】

    (2021.9idea激活码永久)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~1S…

    2022年3月27日
    49
  • oracle创建用户并授权

    一、创建用户登录到system用户以创建其他用户创建的:createuserusernameidentifiedbypassword;二、授权在这里插入代码片

    2022年4月3日
    458
  • js十大算法[通俗易懂]

    js十大算法[通俗易懂]JS的十大经典算法冒泡排序(BubbleSort)冒泡排序须知:作为最简单的排序算法之一,冒泡排序给我的感觉就像Abandon在单词书里出现的感觉一样,每次都在第一页第一位,所以最熟悉。。。冒泡排序还有一种优化算法,就是立一个flag,当在一趟序列遍历中元素没有发生交换,则证明该序列已经有序。但这种改进对于提升性能来说并没有什么太大作用。。。什么时候最快(BestCases):当输入的数据已经是正序时(都已经是正序了,我还要你冒泡排序有何用啊。。。。)什么时候最慢…

    2022年6月18日
    29

发表回复

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

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