⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 send_big_file.h

📁 文件传输
💻 H
字号:
#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <errno.h>#include <string.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <iostream>using namespace std;#define BACKLOG 10#define MAX_LEN 1024*1024#define DOT_PERIOD 50#define NAME_LEN 20//读文件块到缓冲区,用标准I/Ossize_t readall(int fd, void* buf,size_t *len){   size_t nleft;   ssize_t nread;   ssize_t total;   char *ptr;   ptr = (char*)buf;   nleft = *len;   total = 0;   while( nleft > 0){      if((nread = read(fd,ptr,*len)) == -1){         perror("readall");         break;      }      if(nread ==0)         break;      nleft -= nread;      ptr += nread;      total += nread;      *len = nleft;   }   *len = total;   return (nread==-1)?-1:0;}//读取文件块到缓冲区,用文件I/Ossize_t readall(FILE * stream, void* buf,size_t *len){   size_t nread;   char *ptr;   ptr = (char*)buf;   if((nread = fread(ptr, sizeof(char), *len, stream)) == -1){         perror("readall");         exit(1);   }   *len = nread;   return (nread==-1)?-1:0;}//把缓冲区内容写进文件,用标准I/Ossize_t writeall(int fd, void* buf,size_t *len){   size_t nleft;   ssize_t nwrite;   ssize_t total;   const char *ptr;   ptr = (char*)buf;   nleft = *len;   total = 0;   while( nleft > 0){      if((nwrite = write(fd,ptr,*len))== -1){         perror("write all");         break;      }      nleft -= nwrite;      ptr += nwrite;      total += nwrite;      *len = nleft;   }   *len = total;   return (nwrite==-1)?-1:0;}//把缓冲区内容写进文件,用文件I/Ossize_t writeall(FILE * stream, void* buf,size_t *len){   const char *ptr;   ptr = (char*)buf;   int nwrite;   if((nwrite = fwrite(ptr,sizeof(char),*len,stream))== -1){         perror("write all");         exit(1);   }   *len = nwrite;   return (nwrite==-1)?-1:0;}//读入将要传送的文件名int read_cmd(int sockfd,char* cmd_buf,int len){   char line[NAME_LEN];   int my_len = 0;   if(len > MAX_LEN)         len = MAX_LEN;   if((my_len = read(sockfd, line,len))<0 ){            perror("read");            return -1;   }   line[my_len] = '\0';   strcpy(cmd_buf, line);   printf("Client requests file: %s\n",cmd_buf);   return 0;}//传送文件int send_file(int sockfd,char *file_name){    int file_fd;    int file_size;    int read_left;    size_t len;    FILE * filename;    int error_flag;    size_t readlen;    struct stat file_state;    char buffer[MAX_LEN];    int dot_number = 0;     if((file_fd = open(file_name,O_RDONLY)) == -1){        perror("open");        return -1;    }    filename = fopen(file_name,"r");    if(fstat(file_fd, &file_state)==-1){        perror("fstat");        return -1;    }    file_size = file_state.st_size;    read_left = file_size;    len = MAX_LEN;    while(read_left > 0){        readlen = MAX_LEN;        error_flag = readall(filename,buffer,&readlen);        if(error_flag<0 ){            return -1;        }        if(readlen ==0 && read_left!=0){            printf("the file is not read fully!\n");            return -1;        }        read_left -= readlen;        len = readlen;        error_flag = writeall(sockfd,buffer,&len);        if(error_flag == -1){            return -1;        }        if(read_left ==0){            printf("\nServer send file over!\n");        }    }    close(file_fd);    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -