📄 send_big_file_old.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>#define BACKLOG 10#define MAX_LEN 1024#define DOT_PERIOD 50#include <iostream>using namespace std;ssize_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;}ssize_t readall(FILE * stream, void* buf,size_t *len){ size_t nleft; size_t nread; size_t total; char *ptr; ptr = (char*)buf; nleft = *len; total = 0; while( nleft > 0){ if((nread = fread(ptr, sizeof(char), *len, stream)) == -1){ perror("readall"); break; } if(nread ==0) break; nleft -= nread; ptr += nread; total += nread; *len = nleft; cout<<"."; } *len = total; return (nread==-1)?-1:0;}ssize_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;}ssize_t writeall(FILE * stream, void* buf,size_t *len){ size_t nleft; size_t nwritMAX_LENe; size_t total; const char *ptr; ptr = (char*)buf; nleft = *len; total = 0; int nwrite; while( nleft > 0){ if((nwrite = fwrite(ptr,sizeof(char),*len,stream))== -1){ perror("write all"); break; } nleft -= nwrite; ptr += nwrite; total += nwrite; *len = nleft; } *len = total; return (nwrite==-1)?-1:0;}int read_cmd(int sockfd,char* cmd_buf,int len){ char line[MAX_LEN]; int my_len = 0; int total_len =0; char *ptr; int can_read; if(len > MAX_LEN) len = MAX_LEN; can_read = 1; strcpy(cmd_buf,"\0"); 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; 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; } 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){ /* now read the file */ readlen = MAX_LEN; error_flag = readall(file_fd,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 + -