zoukankan      html  css  js  c++  java
  • Linux下基于C实现的socket简单文件上传实例

    此实例是客户端向服务器端传送文件

    服务器端代码实现:

    #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 FU_SERVER_PORT 8080 /*set port*/
    #define FU_BUFFERSIZE 1024 /*set buffer size*/
    #define FU_LISTENQ 10   /*set listen max conncent*/

    int main(int argc,char *argv[])
    {
    int fu_listenfd,fu_connfd,fu_filefd; /*descriptor*/
    int fu_read,fu_write;
    int struct_size;
    struct sockaddr_in fu_servaddr,fu_cliaddr;
    char *fu_filename;
    char *p;
    char buffer[FU_BUFFERSIZE];

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

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

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

    /*bind fu_listenfd*/

    if(-1==(bind(fu_listenfd,(struct sockaddr *)&fu_servaddr, sizeof(fu_servaddr)))){
       perror("fu_bind");
       exit(1);
    }

    /*listen fu_listenfd*/
    if(-1==(listen(fu_listenfd,FU_LISTENQ))){
       perror("fu_listen");
       exit(1);
    }

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

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

       fu_connfd=accept(fu_listenfd,(struct sockaddr *)&fu_cliaddr,&struct_size);
       if(-1==fu_connfd){
        perror("fu_accpet");
        continue;
       }

       fu_filename="/root/backup.txt";
       printf("will upload file name is:%s\n",fu_filename);

       fu_filefd=open(fu_filename,O_RDWR|O_CREAT|O_TRUNC,S_IRWXU);
       if (fu_filefd<0) {
        perror("open localhost file");
        continue;
       }

       while(fu_read=read(fu_connfd,buffer,FU_BUFFERSIZE)) {
        if (fu_read< 0) {
         perror("read client file");
         break;
        }
        if (-1==write(fu_filefd,buffer,fu_read)) {
         perror("writing to filefd error");
         break;
        }
       }
       if(-1==fu_read||-1==fu_write) continue;
       close(fu_filefd);
       close(fu_connfd);
       printf("file upload success!\n");
    }
    close(fu_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 FU_SERVER_PORT 8080 /*set port*/
    #define FU_BUFFERSIZE 1024 /*set buffer size*/

    int main(int argc,char *argv[])
    {
    int fu_sockfd,fu_filefd; /*descriptor*/
    int fu_read,fu_write;
    int struct_size;
    struct sockaddr_in fu_sockaddr;
    char *fu_filename;
    char *p;
    char buffer[FU_BUFFERSIZE];

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

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

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

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

    fu_filename="./will.txt";
    printf("will upload file name is:%s\n",fu_filename);
    fu_filefd=open(fu_filename,O_RDONLY);
    if(-1==fu_filefd){
       perror("open will upload file");
       exit(1);
    }
    while(fu_read=read(fu_filefd,buffer,FU_BUFFERSIZE)){
       if(-1==fu_read){
        perror("read will upload file");
        exit(1);
       }

       p=buffer;
       while(fu_write=write(fu_sockfd,p,fu_read)){
        if(-1==fu_write){
         perror("write client file");
         break;
        }
        else if(fu_read==fu_write) break;
        else if(fu_write>0){
         p+=fu_write;
         fu_read-=fu_write;   
        }
       }
       if(-1==fu_write) exit(1);
    }
    close(fu_filefd);
    close(fu_sockfd);
    printf("file already is uploaded!\n");

    }

  • 相关阅读:
    【HDU3032】Nim or not Nim?(博弈论)
    【BZOJ1022】小约翰的游戏(博弈论)
    【HDU1848】Fibonacci again and again(博弈论)
    【POJ1704】Georgia and Bob(博弈论)
    【BZOJ1299】巧克力棒(博弈论,线性基)
    【Luogu2197】NIM游戏(博弈论)
    【洛谷2252&HDU1527】取石子游戏(博弈论)
    【HDU1846】Brave Game(博弈论)
    【CF888G】Xor-MST(最小生成树,Trie树)
    长链剖分学习笔记
  • 原文地址:https://www.cnblogs.com/zzxap/p/2175802.html
Copyright © 2011-2022 走看看