?? 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 + -