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)
上一篇 2022年6月4日 下午8:16
下一篇 2022年6月4日 下午8:36


相关推荐

  • html语言怎么在虚线中加字,html下划线虚线 高分。。html语言如何在文字下面插入一条虚线。…

    html语言怎么在虚线中加字,html下划线虚线 高分。。html语言如何在文字下面插入一条虚线。…在HTML中边框的下划线用虚线怎么表示出来呀?css里怎么使得文字的下划线是虚线啊?我想做个CSS想让文字的下划线是虚线,请问怎么实现啊?CSS下划线是虚线怎么表示CSS下划线是虚线怎么表示高分。。html语言如何在文字下面插入一条虚线。HTML高手帮我写一段关于带下划虚线的简单代码~谢了看图,红线为虚线。。。就是在一行字下面,比如,一行字只有两个字,但.red-underspanne{bor…

    2022年5月24日
    53
  • google maps api_js调用谷歌浏览器接口

    google maps api_js调用谷歌浏览器接口一:基本知识:1.使用谷歌地图API的第一步就是要注册一个API密钥,需要注重一下两点:1.假如使用API的页面还没有发布,只是在本地调试,可以不用密钥,随便用个字符串代替就可以了。

    2022年8月6日
    14
  • 卡巴斯基2月病毒及恶意软件排行榜

    卡巴斯基2月病毒及恶意软件排行榜互联网“热门”木马病毒排名下面显示了在2009年2月期间,中国地区的互联网上木马病毒的活跃情况。表中所列的都是最常遇到的恶意程序。这些恶意程序会在用户上网的同时给用户带来危害。(下表中的数据根据卡巴斯基产品检测情况统计得出)Nameofmalware % pp1. not-a-virus:AdWare.Win32.BHO.fay     7.69 +102. HEUR:Trojan…

    2022年7月25日
    15
  • layui treeTable「建议收藏」

    layui treeTable「建议收藏」layuitable结构不能很直观的展示层级信息,所以参考”https://fly.layui.com/extend/treeTable/”组件(layui版本为v2.5.6),修改为树形展示,修改了treeTable.js,保留了一些原table定义;修改如下:支持reload,post方式拉取数据,参考table配置(操作列支持toolbar,cols结构,checkStatus),check_mode(0上下级联勾选默认,1单选,2多选[不级联]),open_all(默认展开全部),level_

    2022年4月29日
    159
  • Pycharm汉化后设置无法打开解决办法

    Pycharm汉化后设置无法打开解决办法**Pycharm汉化后设置无法打开解决办法**本人初学python,在安装Pycharm之后,汉化Pycharm时遇到了汉化后设置无法打开的问题。经过百度问题之后,找到了解决方法,并成功解决。在这里给大家整合一下,也留之给未来的自己。如下:首先下载汉化包(我找到的可以汉化成功并且打开设置的汉化包)(1)百度云下载链接链接:https://pan.baidu.com/s/1tpv0…

    2022年5月24日
    40
  • Connecting to a eXtremeDB「建议收藏」

    Connecting to a eXtremeDB「建议收藏」TheeXtremeDBODBCdrivercanconnecttoaneXtremeDBdatabaseintwomanners.Thefirst(whichwerecommended)assumesthatthedriveractslikeaRemoteSQLclient.Thisisathinclientthatserializ

    2022年10月14日
    6

发表回复

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

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