📄 send_big_file.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 + -