服务器和客户端之间采用sendfile高效传送图片

服务器


    #include <sys/socket.h>
    #include <sys/types.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <unistd.h>
    #include <error.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>

    #define SER_PORT 10500
    #define MAX_LEN 512

    int main(int argc,char **argv)
    {
        int listensd,connectsd;
        struct sockaddr_in server;
        struct sockaddr_in client;
        char buf[MAX_LEN];
        FILE *fp;
        int i;
        char *filename = "2new.jpg ";

        listensd=socket(AF_INET,SOCK_STREAM,0);
        if(listensd < 0)
        {
            perror( "Creating socket failed: ");
            exit(1);
        }

        int opt=1;
        setsockopt(listensd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));

        bzero(&server,sizeof(server));
        server.sin_family = AF_INET;
        server.sin_port = htons(SER_PORT);
        server.sin_addr.s_addr = htonl(INADDR_ANY);

        if(bind(listensd,(struct sockaddr *)&server,sizeof(server)) < 0)
        {
            perror( "Bind error. ");
            exit(1);
        }

        if(listen(listensd,5) == -1)
        {
            perror( "listen() error\n ");
            exit(1);
        }

        fp=fopen( filename, "ab");
        if(fp == NULL)
        {
            printf( "File open error!\n ");
            exit(1);
        }

        int rn ;
        int sin_len=sizeof(client);
        if((connectsd = accept(listensd,(struct sockaddr *)&client,&sin_len)) < 0)
        {
            printf( "Can 't accept the request!\n ");
            exit(1);
        }

        while(1)
        {
            rn=recv(connectsd,buf,MAX_LEN,0);
            if(rn < 0)
            {
                printf( "Can 't receive file!\n ");
                exit(1);
            }

            buf[rn]= '\0 ';
                
            if(rn != 0)
            {
                fwrite(buf,1,512,fp);
                bzero(buf,sizeof(buf));     
            }
            else
            {
                printf("receive over.\n");
                break;
            }                                        
        }
        close(connectsd);
        fclose(fp);
        close(listensd);
        return 0;
    }

客户端


    #include <stdio.h>
    #include <sys/socket.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <string.h>
    #include <unistd.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <netdb.h>
    #include <sys/sendfile.h>
    #include <sys/ioctl.h>
    #include <fcntl.h>
    #include <sys/stat.h>

    #define SER_PORT 10500
    #define MAX_LEN 512

    int main(int argc,char **argv)
    {
        int sd;
        int rn;
        struct sockaddr_in client,server;
        struct hostent *h;
        int fq;
        int i;
        char ch;
        struct stat st;
        char *filename = "2.jpg";
        int len = 0;

        sd=socket(AF_INET,SOCK_STREAM,0);
        if(sd < 0)
        {    
            printf( "Creating socket error!\n ");
            exit(1);
        }

        if(argc < 2)
        {
            printf( "Not enough parameter!\n ");
            exit(1);
        }

        h=gethostbyname(argv[1]);
        if(h == NULL)
        {
            printf( "Can 't get hostname ");
            exit(1);
        }

        bzero(&server,sizeof(server));
        server.sin_family=h-> h_addrtype;
        server.sin_port=htons(SER_PORT);
        server.sin_addr = *((struct in_addr *)h-> h_addr);

        int opt=1;
        setsockopt(sd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));

        if(connect(sd,(struct sockaddr *)&server,sizeof(server)) < 0)
        {
            printf( "Connect Error!\n ");
            exit(1);
        }

        fq = open(filename , O_RDONLY);
        if( fq < 0 )
        {
            perror("file error");
            exit(1);
        }

        stat(filename,&st);//获取文件大小
        len = st.st_size;

        if(sendfile(sd,fq,0,len) < 0)
        {
            perror("send error");
            exit(1);
        }
        
        close(sd);
        close(fq);
        return 0;
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值