• Linux下基于C实现的socket简单文件下载实例 科技 紫苹果在线 快乐生活每一天


    Linux下基于C实现的socket简单文件下载实例 - 科技 - 紫苹果在线 - 快乐生活每一天

    Linux下基于C实现的socket简单文件下载实例
    2012-07-11 11:08:58   来源:   评论:0 点击:4

    此实例是客户端向服务器端下载文件:

    实例是客户端向服务器端下载文件:

    服务器端代码实现:

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

    #define FD_SERVER_PORT 8088 /*set port*/
    #define FD_BUFFERSIZE 1024 /*set buffer size*/
    #define FD_LISTENQ 10   /*set listen max conncent*/

    int main(int argc,char *argv[])
    {
    int fd_listenfd,fd_connfd,fd_filefd; /*descriptor*/
    int fd_read,fd_write;
    int struct_size;
    struct sockaddr_in fd_servaddr,fd_cliaddr;
    char *fd_filename;
    char *p;
    char buffer[FD_BUFFERSIZE];

    fd_listenfd=socket(AF_INET,SOCK_STREAM,0); /*create socket*/
    if(fd_listenfd==-1){
       perror("fd_socket");
       exit(1);
    }

    memset(&fd_servaddr,0,sizeof(fd_servaddr)); /*servaddr set 0*/

    fd_servaddr.sin_family=AF_INET;    /*init serveraddr*/
    fd_servaddr.sin_addr.s_addr=INADDR_ANY;
    fd_servaddr.sin_port=htons(FD_SERVER_PORT);

    /*bind fd_listenfd*/

    if(-1==(bind(fd_listenfd,(struct sockaddr *)&fd_servaddr, sizeof(fd_servaddr)))){
       perror("fd_bind");
       exit(1);
    }

    /*listen fd_listenfd*/
    if(-1==(listen(fd_listenfd,FD_LISTENQ))){
       perror("fd_listen");
       exit(1);
    }

    /*file download server start*/
    while(1){
       printf("file download server starting......\n");

       memset(&fd_cliaddr,0,sizeof(fd_cliaddr));
       struct_size=sizeof(fd_cliaddr);

       fd_connfd=accept(fd_listenfd,(struct sockaddr *)&fd_cliaddr,&struct_size);
       if(-1==fd_connfd){
        perror("fd_accpet");
        continue;
       }

       fd_filename="/root/tmp.txt";
       printf("will download file name is:%s\n",fd_filename);
       fd_filefd=open(fd_filename,O_RDONLY);
       if(-1==fd_filefd){
        perror("open will download file");
        continue;
       }
       while(fd_read=read(fd_filefd,buffer,FD_BUFFERSIZE)){
        if(-1==fd_read){
         perror("read will download file");
         break;  
        }

        p=buffer;
        while(fd_write=write(fd_connfd,p,fd_read)){
         if(-1==fd_write){
          perror("write client file");
          break;
         }
         else if(fd_read==fd_write) break;
         else if(fd_write>0){
          p+=fd_write;
          fd_read-=fd_write;    
         }
        }
       }
       if(-1==fd_read||-1==fd_write) continue;
       close(fd_filefd);
       close(fd_connfd);
       printf("file already is downloaded!\n");
    }
    close(fd_listenfd);
    return 0;
    }

    客户端代码实现:

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

    #define FD_SERVER_PORT 8088 /*set port*/
    #define FD_BUFFERSIZE 1024 /*set buffer size*/

    int main(int argc,char *argv[])
    {
    int fd_sockfd,fd_filefd; /*descriptor*/
    int fd_read,fd_write;
    int struct_size;
    struct sockaddr_in fd_sockaddr;
    char *fd_filename;
    char *p;
    char buffer[FD_BUFFERSIZE];

    if (argc!=2) {
       perror("fd_Usage: <./client> <server IP>\n");
       exit(1);
    }
    fd_sockfd=socket(AF_INET,SOCK_STREAM,0); /*create socket*/
    if(fd_sockfd==-1){
       perror("fd_socket");
       exit(1);
    }

    memset(&fd_sockaddr,0,sizeof(fd_sockaddr)); /*servaddr set 0*/

    fd_sockaddr.sin_family=AF_INET;    /*init serveraddr*/
    inet_aton(argv[1],&fd_sockaddr.sin_addr);
    fd_sockaddr.sin_port=htons(FD_SERVER_PORT);

    if(-1==(connect(fd_sockfd,(struct sockaddr *)&fd_sockaddr,sizeof(fd_sockaddr)))){
       perror("fd_connect");
       exit(1);
    }
    printf("start connecting..........\n");

    fd_filename="./backup.txt";
    fd_filefd=open(fd_filename,O_RDWR|O_CREAT|O_TRUNC,S_IRWXU);
    if (-1==fd_filefd) {
       perror("open the backup file");
       exit(1);
    }
    while(fd_read=read(fd_sockfd,buffer,FD_BUFFERSIZE)) {
       if(-1==fd_read){
        perror("read server file");
        exit(1);
       }

       /*p is used to wirte error*/
       p=buffer;
       while(fd_write=write(fd_filefd,p,fd_read)){
        if(-1==fd_write){
         perror("write localhost file");
         exit(1);  
        }
        else if(fd_read==fd_write) break;
        else if(fd_write>0){
         p+=fd_write;
         fd_read-=fd_write;
        }
       }
    }
    close(fd_filefd);
    close(fd_sockfd);
    printf("finsh file download!\n");
    return 0;

    }

  • 相关阅读:
    【设计模式】模板模式
    【设计模式】适配器模式
    【设计模式】观察者模式
    【设计模式】原型模式
    【设计模式】建造模式
    【Android Studio】Android Studio 安装及设置
    【设计模式】工厂模式(静态工厂模式、工厂方法模式、抽象工厂模式)
    【Linux高级驱动】LCD logo
    【Linux高级驱动】LCD驱动框架分析
    【系统移植】JNI
  • 原文地址:https://www.cnblogs.com/lexus/p/2594310.html
Copyright © 2020-2023  润新知