为了账号安全,请及时绑定邮箱和手机立即绑定

作业社区

探索学习新天地,共享知识资源!

0 提交作业
0 布置作业
0 满分作业
得分 100
讨论题

慕九州9493288 的学生作业:

一、代码 linklist.h #ifndef __LINKLIST_H__ #define __LINKLIST_H__ #include #include #include // 定义链表中存储的数据类型 typedef int typedata_t; // 定义链表节点结构体 typedef struct linklist_node { typedata_t data; struct linklist_node* next; }node_linklist_t; // 声明创建空链表的函数 extern node_linklist_t* create_empty_linklist(); //有序插入节点 extern void insert_order_linklist(node_linklist_t* head, typedata_t data); // 打印链表 extern void print_linklist(node_linklist_t* head); // 内存清理 extern void free_linklist(node_linklist_t* head); #endif linklist.c #include "linklist.h" //创建空链表头节点 node_linklist_t* create_empty_linklist() { // 分配头节点内存 node_linklist_t* head = malloc(sizeof(node_linklist_t)); if(NULL == head) { printf("malloc is fail!\n"); return NULL; } // 初始化头节点(数据域为0,指针域为NULL) memset(head,0,sizeof(node_linklist_t)); return head; } //有序插入节点(降序排列) void insert_order_linklist(node_linklist_t* head, typedata_t data) { // 创建新节点 node_linklist_t* temp = malloc(sizeof(node_linklist_t)); if(NULL == temp) { printf("malloc is fail!\n"); return; } // 设置新节点数据 temp->data = data; // 查找插入位置 node_linklist_t* p = head; while(p->next != NULL && data < p->next->data) { p = p->next; } // 插入新节点 temp->next = p->next; p->next = temp; } //打印链表所有节点数据 void print_linklist(node_linklist_t* head) { node_linklist_t* p = head; while(p->next != NULL) { printf("%d ",p->next->data); p = p->next; } printf("\n"); } //释放整个链表内存 void free_linklist(node_linklist_t* head) { node_linklist_t* p = head; while(p != NULL) { node_linklist_t *temp = p;// 保存当前节点 p = p->next;// 移动至下一节点 free(temp);// 释放当前节点 } } main.c #include "linklist.h" int main(int argc, const char *argv[]) { int n = 0; typedata_t data = 0; node_linklist_t* head = create_empty_linklist(); if(head != NULL) { printf("Please input you want to insert data number :"); scanf("%d",&n); printf("Please input %d data :",n); for(int i = 0; i < n;i++) { scanf("%d",&data); insert_order_linklist(head,data); } // 打印链表 print_linklist(head); } // 内存清理 free_linklist(head); head = NULL; return 0; } 二、结果 【图片】

得分 100
讨论题

慕神4583458 的学生作业:

#include #include #include typedef int datatype_t; typedef struct node { datatype_t data; struct node *next; } linknode_t; linknode_t *create_empty_linklist(datatype_t data) { linknode_t *head; head = (linknode_t *)malloc(sizeof(linknode_t)); if (head == NULL) { printf("malloc empty linklist error\n"); return NULL; } head->data = data; head->next = head; return head; } int insert_tail_linklist(linknode_t *head, datatype_t data) { if (head == NULL) return -1; linknode_t *p = head; while(p->next != head) { p = p->next; } linknode_t *temp = NULL; temp = (linknode_t *)malloc(sizeof(linknode_t)); if (temp == NULL) { return -2; } temp->data = data; temp->next = head; p->next = temp; return 0; } linknode_t *find_linklist(linknode_t *head, datatype_t data) { linknode_t *p = head; linknode_t *target = NULL; do { if (p->next->data == data) { return p->next; } p = p->next; } while(p!= head); return NULL; } void print_linklist(linknode_t *head) { linknode_t *p = head; do{ printf("%d ", p->data); p = p->next; }while(p != head); printf("\n"); } void delete_game(int n, int k, int m) { if (n < 1) { return; } linknode_t *head = create_empty_linklist(1); printf("create success\n"); int i; for (i = 2; i next; } temp->next = start->next; temp = start; start = temp->next; fprintf(stderr, "%d ", temp->data); if (start == temp) { free(temp); break; } free(temp); } } void main() { delete_game(8,3,4); } 【图片】

得分 100
学习任务

慕神4583458 的学生作业:

linklist.c #include "linklist.h" linknode_t *create_empty_linklist() { linknode_t *head = NULL; head = (linknode_t *)malloc(sizeof(linknode_t)); if (head == NULL) { printf("malloc hlinklist error\n"); return NULL; } return head; } void insert_head_linklist(linknode_t *head, datatype_t data) { if (head == NULL) return; linknode_t *temp = NULL; temp = (linknode_t *)malloc(sizeof(linknode_t)); if (temp == NULL) { printf("malloc data error\n"); return; } temp->data = data; temp->next = head->next; head->next = temp; } void insert_tail_linklist(linknode_t *head, datatype_t data) { if (head == NULL) return; linknode_t *temp = NULL, *p = head; temp = (linknode_t *)malloc(sizeof(linknode_t)); if (temp == NULL) { printf("malloc data error\n"); return; } temp->data = data; while(p->next != NULL) { p = p->next; } p->next = temp; temp->next = NULL; } void insert_order_linklist(linknode_t *head, datatype_t data) { if (head == NULL) return; linknode_t *temp = NULL, *p = head; temp = (linknode_t *)malloc(sizeof(linknode_t)); if (temp == NULL) { printf("malloc data error\n"); return; } temp->data = data; while(p->next != NULL && p->next->data < data) { p = p->next; } temp->next = p->next; p->next = temp; } void print_linklist(linknode_t *head) { linknode_t *p = head->next; while(p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } int is_empty_linklist(linknode_t *head) { return head->next == NULL ? 1 : 0; } int delete_data_linklist(linknode_t *head, datatype_t data) { int flag = 0; linknode_t *p = head, *q; while(p->next) { if (p->next->data == data) { flag = 1; q = p->next; p->next = q->next; free(q); q = NULL; } else { p = p->next; } } return flag; } void reverse_data_linklist(linknode_t *head) { linknode_t *p = head->next; linknode_t *q = NULL; head->next = NULL; while(p != NULL) { printf("data= %d", p->data); q = p->next; p->next = head->next; head->next = p; p = q; } printf("end\n"); } void clean_up_linklist(linknode_t *head) { linknode_t *p = head; linknode_t *q = NULL; while(p->next != NULL) { q = p->next; p->next = p->next->next; free(q); print_linklist(head); } }; main.c #include "linklist.h" void main() { linknode_t *linklist = create_empty_linklist(); datatype_t arr[] = {1,5,3,7,9}; int i; int size = sizeof(arr) / sizeof(arr[0]); for (i = 0; i < size; i++) { insert_order_linklist(linklist, arr[i]); } print_linklist(linklist); printf("===============reverse===========\n"); reverse_data_linklist(linklist); print_linklist(linklist); printf("=============clean up==========\n"); clean_up_linklist(linklist); } 【图片】

得分 100
讨论题

慕神4583458 的学生作业:

linklist.c #include "linklist.h" linknode_t *create_empty_linklist() { linknode_t *head = NULL; head = (linknode_t *)malloc(sizeof(linknode_t)); if (head == NULL) { printf("malloc hlinklist error\n"); return NULL; } return head; } void insert_head_linklist(linknode_t *head, datatype_t data) { if (head == NULL) return; linknode_t *temp = NULL; temp = (linknode_t *)malloc(sizeof(linknode_t)); if (temp == NULL) { printf("malloc data error\n"); return; } temp->data = data; temp->next = head->next; head->next = temp; } void insert_tail_linklist(linknode_t *head, datatype_t data) { if (head == NULL) return; linknode_t *temp = NULL, *p = head; temp = (linknode_t *)malloc(sizeof(linknode_t)); if (temp == NULL) { printf("malloc data error\n"); return; } temp->data = data; while(p->next != NULL) { p = p->next; } p->next = temp; temp->next = NULL; } void insert_order_linklist(linknode_t *head, datatype_t data) { if (head == NULL) return; linknode_t *temp = NULL, *p = head; temp = (linknode_t *)malloc(sizeof(linknode_t)); if (temp == NULL) { printf("malloc data error\n"); return; } temp->data = data; while(p->next != NULL && p->next->data < data) { p = p->next; } temp->next = p->next; p->next = temp; } void print_linklist(linknode_t *head) { linknode_t *p = head; while(p->next) { printf("%d ", p->data); p = p->next; } printf("\n"); } int is_empty_linklist(linknode_t *head) { return head->next == NULL ? 1 : 0; } int delete_data_linklist(linknode_t *head, datatype_t data) { int flag = 0; linknode_t *p = head, *q; while(p->next) { if (p->next->data == data) { flag = 1; q = p->next; p->next = q->next; free(q); q = NULL; } else { p = p->next; } } return flag; } #include "linklist.h" void main() { linknode_t *linklist = create_empty_linklist(); datatype_t arr[] = {1,5,3,7,9,5,8,3}; int i; int size = sizeof(arr) / sizeof(arr[0]); for (i = 0; i < size; i++) { insert_order_linklist(linklist, arr[i]); } print_linklist(linklist); int ret; ret = delete_data_linklist(linklist, 3); if (ret) { printf("delete success\n"); } print_linklist(linklist); } 【图片】

得分 100
讨论题

慕神4583458 的学生作业:

linklist.h #ifndef __LINKLIST_H__ #define __LINKLIST_H__ #include #include #include typedef int datatype_t; typedef struct node { datatype_t data; struct node *next; } linknode_t; extern linknode_t *create_empty_linklist(); extern void insert_head_linklist(linknode_t *head, datatype_t data); extern void insert_tail_linklist(linknode_t *head, datatype_t data); extern void insert_order_linklist(linknode_t *head, datatype_t data); extern void print_linklist(linknode_t *head); #endif linklist.c #include "linklist.h" linknode_t *create_empty_linklist() { linknode_t *head = NULL; head = (linknode_t *)malloc(sizeof(linknode_t)); if (head == NULL) { printf("malloc hlinklist error\n"); return NULL; } return head; } void insert_head_linklist(linknode_t *head, datatype_t data) { if (head == NULL) return; linknode_t *temp = NULL; temp = (linknode_t *)malloc(sizeof(linknode_t)); if (temp == NULL) { printf("malloc data error\n"); return; } temp->data = data; temp->next = head->next; head->next = temp; } void insert_tail_linklist(linknode_t *head, datatype_t data) { if (head == NULL) return; linknode_t *temp = NULL, *p = head; temp = (linknode_t *)malloc(sizeof(linknode_t)); if (temp == NULL) { printf("malloc data error\n"); return; } temp->data = data; while(p->next != NULL) { p = p->next; } p->next = temp; temp->next = NULL; } void insert_order_linklist(linknode_t *head, datatype_t data) { if (head == NULL) return; linknode_t *temp = NULL, *p = head; temp = (linknode_t *)malloc(sizeof(linknode_t)); if (temp == NULL) { printf("malloc data error\n"); return; } temp->data = data; while(p->next != NULL && p->next->data < data) { p = p->next; } temp->next = p->next; p->next = temp; } void print_linklist(linknode_t *head) { linknode_t *p = head; while(p->next) { printf("%d ", p->data); p = p->next; } printf("\n"); } main.c #include "linklist.h" void main() { linknode_t *linklist = create_empty_linklist(); datatype_t arr[] = {1,5,3,7,9}; int i; int size = sizeof(arr) / sizeof(arr[0]); for (i = 0; i < size; i++) { insert_order_linklist(linklist, arr[i]); } print_linklist(linklist); } 【图片】

得分 100
学习任务

北城半夏4806197 的学生作业:

服务端 #include "tcp_socket.h" #include "debug.h" #include #include #include "file_transfer.h" // 线程执行函数 void *do_task(void *arg) { size_t size; int cfd = *(int *)arg; size = client_upload_file(cfd);// 接收客户端上传的文件 printf("client upload file size : %ld\n",size); pthread_exit(NULL); } int main(int argc,char *argv[]) { int sfd,cfd; struct sockaddr_in cli_addr; int ret; pthread_t tid; if (argc != 3){ fprintf(stderr,"Usage : %s < ip > < port >.\n",argv[0]); exit(EXIT_FAILURE); } sfd = create_tcp_server_socket(argv[1],atoi(argv[2])); if (sfd == -1) exit(EXIT_FAILURE); for(;;){ bzero(&cli_addr,sizeof(struct sockaddr_in)); cfd = wait_for_connect(sfd,&cli_addr); if (cfd == -1) exit(EXIT_FAILURE); show_tcp_network_address(&cli_addr); // 创建子线程,用于接收上传的文件 ret = pthread_create(&tid,NULL,do_task,(void *)&cfd); if (ret != 0){ DEBUG_INFO("[ERROR] pthread_create() : %s\n",strerror(errno)); exit(EXIT_FAILURE); } // 进行线程分离 pthread_detach(tid); } close(cfd); close(sfd); return 0; } 客户端 #include "tcp_socket.h" #include "file_transfer.h" #include int main(int argc,char *argv[]) { int cfd; if (argc != 4){ fprintf(stderr,"Usage : %s < ip > < port > < pathname >\n",argv[0]); exit(EXIT_FAILURE); } cfd = create_tcp_client_socket(argv[1],atoi(argv[2])); if (cfd == -1) exit(EXIT_FAILURE); upload_file(argv[3],cfd); // 上传客户端的数据 close(cfd); return 0; } 【图片】

得分 100
学习任务

北城半夏4806197 的学生作业:

file_transfer.c #include"file_transfer.h" #include"debug.h" //接收协议头 int recv_protocol_head(int cfd,file_protocol_t *p_head) { ssize_t rbytes; ssize_t total_received = 0; char *buffer = (char *)p_head;// 按照字节流接收 // 进行循环接收,防止 tcp 粘包 for(;;){ //接收数据 rbytes = tcp_recv_pack(cfd,buffer + total_received,sizeof(file_protocol_t) - total_received); if (rbytes == -1){ DEBUG_INFO("[ERROR]: %s ",strerror(errno)); return -1; }else if (rbytes == 0){ DEBUG_INFO("[INFO] : The client has been shut down.\n"); break; }else if (rbytes > 0){ total_received += rbytes; if (total_received == sizeof(file_protocol_t)) // 接收固定长度的数据 break; } } if (total_received != sizeof(file_protocol_t)){ DEBUG_INFO("[ERROR] : Failed to receive data.\n"); return -1; } return 0; } //接收文件数据 int recv_filedata(int cfd,const char *filename,size_t targetsize) { int fd; ssize_t rbytes = 0,wbytes = 0,file_size = 0; char buffer[1024] = {0}; DEBUG_INFO("[INFO] : filename %s\n",filename); fd = open(filename,O_WRONLY|O_CREAT|O_TRUNC,0666); if (fd == -1){ DEBUG_INFO("[ERROR] Failed to open filename.\n"); return -1; } for(;;){ rbytes = tcp_recv_pack(cfd,buffer,sizeof(buffer)); if (rbytes == -1){ DEBUG_INFO("[ERROR]: %s ",strerror(errno)); return -1; }else if (rbytes == 0){ DEBUG_INFO("[INFO] : The client has been shut down.\n"); break; }else if (rbytes > 0){ wbytes = write(fd,buffer,rbytes); if (wbytes != rbytes){ DEBUG_INFO("[ERROR] : Failed to write data.\n"); return -1; } file_size += rbytes; if (file_size == targetsize) break; } } close(fd); return file_size; } //文件上传接口 int client_upload_file(int cfd) { int ret; char *filename; size_t filesize = 0,recvsize = 0; file_protocol_t head; ret = recv_protocol_head(cfd,&head); if (ret == -1) return -1; filename = head.filename; filesize = head.filesize; recvsize = recv_filedata(cfd,filename,filesize); printf("Recv %%%d\n",(int)(recvsize * 1.0 / filesize) * 100); return recvsize; } //协议头 发送接口 int send_protocol_head(const char *filename,int sockfd) { int fd; int filesize; int ret; file_protocol_t head; fd = open(filename,O_RDONLY); if (fd == -1){ DEBUG_INFO("[ERROR] Failed to open filename.\n"); return -1; } filesize = lseek(fd,0,SEEK_END); close(fd); head.filesize = filesize; strcpy(head.filename,filename); ret = tcp_send_pack(sockfd,&head,sizeof(head)); if (ret != sizeof(file_protocol_t)){ DEBUG_INFO("[ERROR] Failed to send protocol head.\n"); return -1; } return filesize; } //文件上传发送 int upload_file(const char *filename,int sockfd) { int file_size,upload_size; int fd; ssize_t rbytes = 0,sbytes = 0; char buffer[1024] = {0}; file_size = send_protocol_head(filename,sockfd); if (file_size < 0){ return -1; } fd = open(filename,O_RDONLY); if (fd == -1){ DEBUG_INFO("[ERROR] Failed to open filename.\n"); return -1; } for(;;){ rbytes = read(fd,buffer,sizeof(buffer)); if (rbytes == -1){ DEBUG_INFO("[ERROR] Failed to read data.\n"); return -1; } sbytes = tcp_send_pack(sockfd,buffer,rbytes); if (sbytes != rbytes){ DEBUG_INFO("[ERROR] Failed to send data.\n"); return -1; } upload_size += rbytes; } close(fd); return upload_size; } file_transfer.h #ifndef __FILE_TRANSFER_H_ #define __FILE_TRANSFER_H #include "tcp_socket.h" #include #include #include #define FILENAME_SZ 256 typedef struct file_protocol{ size_t filesize; // 文件大小 char filename[FILENAME_SZ]; // 文件名 }file_protocol_t; extern int recv_protocol_head(int cfd,file_protocol_t *p_head); extern int recv_filedata(int cfd,const char *filename,size_t targetsize); extern int client_upload_file(int cfd); extern int send_protocol_head(const char *filename,int sockfd); extern int upload_file(const char *filename,int sockfd); #endif

得分 100
学习任务

北城半夏4806197 的学生作业:

file_transfer.c #include"file_transfer.h" #include"debug.h" //接收协议头 int recv_protocol_head(int cfd,file_protocol_t *p_head) { ssize_t rbytes; ssize_t total_received = 0; char *buffer = (char *)p_head;// 按照字节流接收 // 进行循环接收,防止 tcp 粘包 for(;;){ //接收数据 rbytes = tcp_recv_pack(cfd,buffer + total_received,sizeof(file_protocol_t) - total_received); if (rbytes == -1){ DEBUG_INFO("[ERROR]: %s ",strerror(errno)); return -1; }else if (rbytes == 0){ DEBUG_INFO("[INFO] : The client has been shut down.\n"); break; }else if (rbytes > 0){ total_received += rbytes; if (total_received == sizeof(file_protocol_t)) // 接收固定长度的数据 break; } } if (total_received != sizeof(file_protocol_t)){ DEBUG_INFO("[ERROR] : Failed to receive data.\n"); return -1; } return 0; } //接收文件数据 int recv_filedata(int cfd,const char *filename,size_t targetsize) { int fd; ssize_t rbytes = 0,wbytes = 0,file_size = 0; char buffer[1024] = {0}; DEBUG_INFO("[INFO] : filename %s\n",filename); fd = open(filename,O_WRONLY|O_CREAT|O_TRUNC,0666); if (fd == -1){ DEBUG_INFO("[ERROR] Failed to open filename.\n"); return -1; } for(;;){ rbytes = tcp_recv_pack(cfd,buffer,sizeof(buffer)); if (rbytes == -1){ DEBUG_INFO("[ERROR]: %s ",strerror(errno)); return -1; }else if (rbytes == 0){ DEBUG_INFO("[INFO] : The client has been shut down.\n"); break; }else if (rbytes > 0){ wbytes = write(fd,buffer,rbytes); if (wbytes != rbytes){ DEBUG_INFO("[ERROR] : Failed to write data.\n"); return -1; } file_size += rbytes; if (file_size == targetsize) break; } } close(fd); return file_size; } //文件上传接口 int client_upload_file(int cfd) { int ret; char *filename; size_t filesize = 0,recvsize = 0; file_protocol_t head; ret = recv_protocol_head(cfd,&head); if (ret == -1) return -1; filename = head.filename; filesize = head.filesize; recvsize = recv_filedata(cfd,filename,filesize); printf("Recv %%%d\n",(int)(recvsize * 1.0 / filesize) * 100); return recvsize; } //协议头发送接口 int send_protocol_head(const char *filename,int sockfd) { int fd; int filesize; int ret; file_protocol_t head; fd = open(filename,O_RDONLY); if (fd == -1){ DEBUG_INFO("[ERROR] Failed to open filename.\n"); return -1; } filesize = lseek(fd,0,SEEK_END); close(fd); head.filesize = filesize; strcpy(head.filename,filename); ret = tcp_send_pack(sockfd,&head,sizeof(head)); if (ret != sizeof(file_protocol_t)){ DEBUG_INFO("[ERROR] Failed to send protocol head.\n"); return -1; } return filesize; } file_transfer.h #ifndef __FILE_TRANSFER_H_ #define __FILE_TRANSFER_H #include "tcp_socket.h" #include #include #include #define FILENAME_SZ 256 typedef struct file_protocol{ size_t filesize; // 文件大小 char filename[FILENAME_SZ]; // 文件名 }file_protocol_t; extern int recv_protocol_head(int cfd,file_protocol_t *p_head); extern int recv_filedata(int cfd,const char *filename,size_t targetsize); extern int client_upload_file(int cfd); extern int send_protocol_head(const char *filename,int sockfd); #endif

得分 100
学习任务

北城半夏4806197 的学生作业:

file_transfer.c #include"file_transfer.h" #include"debug.h" //接收协议头 int recv_protocol_head(int cfd,file_protocol_t *p_head) { ssize_t rbytes; ssize_t total_received = 0; char *buffer = (char *)p_head;// 按照字节流接收 // 进行循环接收,防止 tcp 粘包 for(;;){ //接收数据 rbytes = tcp_recv_pack(cfd,buffer + total_received,sizeof(file_protocol_t) - total_received); if (rbytes == -1){ DEBUG_INFO("[ERROR]: %s ",strerror(errno)); return -1; }else if (rbytes == 0){ DEBUG_INFO("[INFO] : The client has been shut down.\n"); break; }else if (rbytes > 0){ total_received += rbytes; if (total_received == sizeof(file_protocol_t)) // 接收固定长度的数据 break; } } if (total_received != sizeof(file_protocol_t)){ DEBUG_INFO("[ERROR] : Failed to receive data.\n"); return -1; } return 0; } //接收文件数据 int recv_filedata(int cfd,const char *filename,size_t targetsize) { int fd; ssize_t rbytes = 0,wbytes = 0,file_size = 0; char buffer[1024] = {0}; DEBUG_INFO("[INFO] : filename %s\n",filename); fd = open(filename,O_WRONLY|O_CREAT|O_TRUNC,0666); if (fd == -1){ DEBUG_INFO("[ERROR] Failed to open filename.\n"); return -1; } for(;;){ rbytes = tcp_recv_pack(cfd,buffer,sizeof(buffer)); if (rbytes == -1){ DEBUG_INFO("[ERROR]: %s ",strerror(errno)); return -1; }else if (rbytes == 0){ DEBUG_INFO("[INFO] : The client has been shut down.\n"); break; }else if (rbytes > 0){ wbytes = write(fd,buffer,rbytes); if (wbytes != rbytes){ DEBUG_INFO("[ERROR] : Failed to write data.\n"); return -1; } file_size += rbytes; if (file_size == targetsize) break; } } close(fd); return file_size; } //文件上传接口 int client_upload_file(int cfd) { int ret; char *filename; size_t filesize = 0,recvsize = 0; file_protocol_t head; ret = recv_protocol_head(cfd,&head); if (ret == -1) return -1; filename = head.filename; filesize = head.filesize; recvsize = recv_filedata(cfd,filename,filesize); printf("Recv %%%d\n",(int)(recvsize * 1.0 / filesize) * 100); return recvsize; } flie_transfer.h #ifndef __FILE_TRANSFER_H_ #define __FILE_TRANSFER_H #include "tcp_socket.h" #include #include #include #define FILENAME_SZ 256 typedef struct file_protocol{ size_t filesize; // 文件大小 char filename[FILENAME_SZ]; // 文件名 }file_protocol_t; extern int recv_protocol_head(int cfd,file_protocol_t *p_head); extern int recv_filedata(int cfd,const char *filename,size_t targetsize); extern int client_upload_file(int cfd); #endif

得分 100
学习任务

北城半夏4806197 的学生作业:

file_transfer.c #include"file_transfer.h" #include"debug.h" //接收协议头 int recv_protocol_head(int cfd,file_protocol_t *p_head) { ssize_t rbytes; ssize_t total_received = 0; char *buffer = (char *)p_head;// 按照字节流接收 // 进行循环接收,防止 tcp 粘包 for(;;){ //接收数据 rbytes = tcp_recv_pack(cfd,buffer + total_received,sizeof(file_protocol_t) - total_received); if (rbytes == -1){ DEBUG_INFO("[ERROR]: %s ",strerror(errno)); return -1; }else if (rbytes == 0){ DEBUG_INFO("[INFO] : The client has been shut down.\n"); break; }else if (rbytes > 0){ total_received += rbytes; if (total_received == sizeof(file_protocol_t)) // 接收固定长度的数据 break; } } if (total_received != sizeof(file_protocol_t)){ DEBUG_INFO("[ERROR] : Failed to receive data.\n"); return -1; } return 0; } //接收文件数据 int recv_filedata(int cfd,const char *filename,size_t targetsize) { int fd; ssize_t rbytes = 0,wbytes = 0,file_size = 0; char buffer[1024] = {0}; DEBUG_INFO("[INFO] : filename %s\n",filename); fd = open(filename,O_WRONLY|O_CREAT|O_TRUNC,0666); if (fd == -1){ DEBUG_INFO("[ERROR] Failed to open filename.\n"); return -1; } for(;;){ rbytes = tcp_recv_pack(cfd,buffer,sizeof(buffer)); if (rbytes == -1){ DEBUG_INFO("[ERROR]: %s ",strerror(errno)); return -1; }else if (rbytes == 0){ DEBUG_INFO("[INFO] : The client has been shut down.\n"); break; }else if (rbytes > 0){ wbytes = write(fd,buffer,rbytes); if (wbytes != rbytes){ DEBUG_INFO("[ERROR] : Failed to write data.\n"); return -1; } file_size += rbytes; if (file_size == targetsize) break; } } close(fd); return file_size; } file_transfer.h #ifndef __FILE_TRANSFER_H_ #define __FILE_TRANSFER_H #include "tcp_socket.h" #include #include #include #define FILENAME_SZ 256 typedef struct file_protocol{ size_t filesize; // 文件大小 char filename[FILENAME_SZ]; // 文件名 }file_protocol_t; extern int recv_protocol_head(int cfd,file_protocol_t *p_head); extern int recv_filedata(int cfd,const char *filename,size_t targetsize); #endif

微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号