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

作业社区

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

0 提交作业
0 布置作业
0 满分作业
得分 100
学习任务

城仔 的学生作业:

#include #include #include #include #include #include #define buffer_size 1024 int main(void) { pid_t cpid; int ret; int pipefd[2];//管道文件描述符,pipefd[0]为读端,pipefd[1]为写端 ret = pipe(pipefd); //创建管道之后,内核会将文件描述存储到数组中 if(ret == -1){ perror("[error] pipe(): "); exit(EXIT_FAILURE); } cpid = fork(); if(cpid == -1){ perror("[error] fork(): "); close(pipefd[0]); close(pipefd[1]); exit(EXIT_FAILURE); }else if(cpid == 0){ ssize_t rbytes; char buffer[buffer_size] = {0}; close(pipefd[1]); //关闭子进程写端文件描述符 printf("从管道获取数据\n"); while(rbytes = read(pipefd[0],buffer,buffer_size -1) > 0){ buffer[rbytes] = '\0'; printf("读取到数据: %s\n",buffer); memset(buffer,0,buffer_size); } if(rbytes == -1){ perror("[error] read(): "); close(pipefd[0]); exit(EXIT_FAILURE); } printf("管道写端关闭\n"); close(pipefd[0]); exit(EXIT_SUCCESS); }else if(cpid > 0){ ssize_t wbytes; char input_buffer[buffer_size] ={0}; close(pipefd[0]);//关闭父进程读端 printf("请输入数据,输入quit推出 \n"); while(fgets(input_buffer,buffer_size,stdin) != NULL){ input_buffer[strcspn(input_buffer,"\n")] = '\0'; if(strcmp(input_buffer,"quit") == 0){ printf("退出!"); break; } ssize_t wbytes = write(pipefd[1],input_buffer,strlen(input_buffer)); if(wbytes == -1){ perror("[error] write(): "); wait(NULL); close(pipefd[1]); exit(EXIT_FAILURE); } memset(input_buffer,0,buffer_size); } close(pipefd[1]); wait(NULL); printf("程序退出!\n"); } return 0; } 【图片】

得分 100
学习任务

慕工程6300203 的学生作业:

client.c #include "tcp_socket.h" #include "file_transfer.h" #include "debug.h" int main(int argc, char* argv[]) { int client_sockfd; if (argc < 5 || argc > 6) { printf("Usage : %s \n", argv[0]); exit(EXIT_FAILURE); } client_sockfd = create_tcp_client_socket(argv[2], atoi(argv[3])); if (client_sockfd == -1) exit(EXIT_FAILURE); if(strcmp(argv[1], "upload") == 0) { upload_file(client_sockfd, argv[4]); } else if(strcmp(argv[1], "download") == 0) { download_file(client_sockfd, argv[4], argv[5]); } close(client_sockfd); return 0; } server.c #include "tcp_socket.h" #include "file_transfer.h" #include "debug.h" #include void * do_pthread_func(void *arg) { int fd = *(int *)arg; do_client_request(fd); close(fd); pthread_exit(NULL); } int main(int argc, char* argv[]) { int server_sockfd,client_sockfd, ret; struct sockaddr_in client_addr; pthread_t tid; if (argc != 3) { printf("Usage : %s \n", argv[0]); exit(EXIT_FAILURE); } server_sockfd = create_tcp_server_socket(argv[1], atoi(argv[2])); if (server_sockfd == -1) exit(EXIT_FAILURE); while (1) { bzero(&client_addr, sizeof(struct sockaddr_in)); client_sockfd = wait_for_connect(server_sockfd, client_addr); if (client_sockfd == -1) exit(EXIT_FAILURE); show_tcp_network_address(&client_addr); ret = pthread_create(&tid, NULL, do_pthread_func, (void*)&client_sockfd); if (ret != 0) { DEBUG_INFO("[ERROR] %s\n", strerror(ret)); exit(EXIT_FAILURE); } pthread_detach(tid); } close(server_sockfd); return 0; } tcp_socket.c #include "tcp_socket.h" #include "debug.h" #define BACKLOG 10 /** * 创建socket * @param ip * @param port * @return socket_fd */ int create_tcp_server_socket(const char *ip, unsigned short port) { int sockfd, ret; struct sockaddr_in server_addr; sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1) { DEBUG_INFO("[ERROR] %s", strerror(errno)); return -1; } bzero(&server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(port); server_addr.sin_addr.s_addr = inet_addr(ip); ret = bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)); if(ret == -1) { DEBUG_INFO("[ERROR] %s", strerror(errno)); return -1; } ret = listen(sockfd, BACKLOG); if(ret == -1) { DEBUG_INFO("[ERROR] %s", strerror(errno)); return -1; } return sockfd; } /** * 创建客户端socket * @param ip * @param port * @return socket_fd */ int create_tcp_client_socket(const char *ip, unsigned short port) { int sockfd, ret; struct sockaddr_in peer_addr; sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1) { DEBUG_INFO("[ERROR] %s", strerror(errno)); return -1; } peer_addr.sin_family = AF_INET; peer_addr.sin_port = htons(port); peer_addr.sin_addr.s_addr = inet_addr(ip); ret = connect(sockfd, (struct sockaddr*)&peer_addr, sizeof(peer_addr)); if(ret == -1) { DEBUG_INFO("[ERROR] %s", strerror(errno)); return -1; } return sockfd; } /** * 用于与客户端建立连接 * @param sockfd * @param client_addr * @return */ int wait_for_connect(int sockfd, struct sockaddr_in client_addr) { int client_sockfd, ret; int len = sizeof(struct sockaddr_in); client_sockfd = accept(sockfd, (struct sockaddr*)&client_addr, &len); if(ret == -1) { DEBUG_INFO("[ERROR] %s", strerror(errno)); return -1; } return client_sockfd; } /** * 显示连接客户端的地址信息 * @param sockaddr */ void show_tcp_network_address(struct sockaddr_in *sockaddr) { printf("=================\n"); printf("ip:%s\n", inet_ntoa(sockaddr->sin_addr)); printf("port:%d\n", ntohs(sockaddr->sin_port)); } /** * 发送数据 * @param sockfd * @param data * @param len * @return */ ssize_t tcp_send_packet(int sockfd, void *data, size_t len) { return send(sockfd, data, len, 0); } /** * 接收数据 * @param sockfd * @param data * @param len * @return */ ssize_t tcp_recv_packet(int sockfd, void *data, size_t len) { return recv(sockfd, data, len, 0); } file_transfer.c #include "file_transfer.h" #include "debug.h" #include "tcp_socket.h" /** * 接收协议头 * @param cfd * @param p_head * @return */ int recv_protocol_head(int cfd, file_protocol_t *p_head) { ssize_t rbytes = 0, total_received = 0; char *buffer = (char *) p_head; while (1) { rbytes = tcp_recv_packet(cfd, buffer + total_received, sizeof(file_protocol_t) - total_received); if (rbytes == -1) { DEBUG_INFO("[ERROR] %s\n", strerror(errno)); return -1; } else if (rbytes == 0) { DEBUG_INFO("[INFO] the client has been shutdown.\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 recv data.\n"); return -1; } return 0; } /** * 接收文件内容 * @param cfd * @param file_name * @param target_file_size * @return */ int recv_file_data(int cfd, char *file_name, size_t target_file_size) { int fd; ssize_t rbytes = 0, wbytes = 0, total_received = 0; char buffer[1024] = {0}; // 打开文件 fd = open(file_name, O_WRONLY | O_CREAT | O_TRUNC, 0644); if (fd == -1) { DEBUG_INFO("[ERROR] %s\n", strerror(errno)); return -1; } while (1) { rbytes = tcp_recv_packet(cfd, buffer, sizeof(buffer)); if (rbytes == -1) { DEBUG_INFO("[ERROR] %s\n", strerror(errno)); return -1; } else if (rbytes == 0) { DEBUG_INFO("[INFO] the client has been shutdown.\n"); break; } else if (rbytes > 0) { wbytes = write(fd, buffer, rbytes); if (wbytes == -1) { DEBUG_INFO("[ERROR] %s\n", strerror(errno)); return -1; } total_received += rbytes; if (total_received == target_file_size) break; } } close(fd); return total_received; } /** * 服务器处理客户端请求 * @param cfd * @return */ int do_client_request(int cfd) { int ret; file_protocol_t head; bzero(&head, sizeof(head)); ret = recv_protocol_head(cfd, &head); if (ret == -1) return -1; if (strcmp(head.cmd, "upload") == 0) { ret = client_upload_file(cfd, &head); } else if (strcmp(head.cmd, "download") == 0) { ret = client_download_file(cfd, &head); } return ret; } /** * 服务器接收客户端上传的文件 * @param cfd * @param p_head * @return */ int client_upload_file(int cfd, file_protocol_t *p_head) { int received_size = recv_file_data(cfd, p_head->file_name, p_head->file_size); printf("received file size is %d\n", received_size); return received_size; } /** * 发送协议头 * @param cfd * @param file_name * @param cmd * @return */ int send_protocol_head(int cfd, const char *file_name, char *cmd) { int fd, file_size = 0; file_protocol_t head; ssize_t wbytes; fd = open(file_name, O_RDONLY); if (fd == -1) { DEBUG_INFO("[ERROR] %s\n", strerror(errno)); return -1; } file_size = lseek(fd, 0, SEEK_END); close(fd); head.file_size = file_size; strcpy(head.file_name, file_name); strcpy(head.cmd, cmd); wbytes = tcp_send_packet(cfd, &head, sizeof(head)); if (wbytes != sizeof(file_protocol_t)) { DEBUG_INFO("[ERROR] %s\n", strerror(errno)); return -1; } return file_size; } /** * 客户端上传协议头和文件数据给服务器 * @param cfd * @param file_name * @return */ int upload_file(int cfd, const char *file_name) { int fd, file_size, rbytes = 0, sbytes = 0, upload_size = 0; char buffer[1024] = {0}; file_size = send_protocol_head(cfd, file_name, "upload"); if (file_size == -1) return -1; fd = open(file_name, O_RDONLY); if (fd == -1) { DEBUG_INFO("[ERROR] %s\n", strerror(errno)); return -1; } while (1) { rbytes = read(fd, buffer, sizeof(buffer)); if (rbytes == -1) { DEBUG_INFO("[ERROR] %s\n", strerror(errno)); return -1; } else if (rbytes == 0) { break; } else if (rbytes > 0) { sbytes = tcp_send_packet(cfd, buffer, rbytes); if (sbytes != rbytes) { DEBUG_INFO("[ERROR] %s\n", strerror(errno)); return -1; } upload_size += sbytes; } } close(fd); return upload_size; } /** * 服务器接收客户端下载文件的请求 * @param cfd * @param p_head * @return */ int client_download_file(int cfd, file_protocol_t *p_head) { int ret, download_size = 0; int fd, file_size = 0, rbytes = 0, sbytes = 0; char buffer[1024] = {0}; fd = open(p_head->file_name, O_RDONLY); if (fd == -1) { DEBUG_INFO("[ERROR] %s\n", strerror(errno)); return -1; } file_size = send_protocol_head(cfd, p_head->file_name, "download"); if (file_size == -1) return -1; while (1) { bzero(buffer, sizeof(buffer)); rbytes = read(fd, buffer, sizeof(buffer)); if (rbytes == -1) { DEBUG_INFO("[ERROR] %s\n", strerror(errno)); return -1; } else if (rbytes == 0) { break; } else if (rbytes > 0) { sbytes = tcp_send_packet(cfd, buffer, rbytes); if (sbytes != rbytes) { DEBUG_INFO("[ERROR] %s\n", strerror(errno)); return -1; } download_size += sbytes; } } close(fd); printf("download file size is %d\n", download_size); return download_size; } /** * 客户端发送下载文件的请求给服务器 * @param cfd * @param file_name * @param target_file_name * @return */ int download_file(int cfd, const char *file_name, char *target_file_name) { file_protocol_t shead; file_protocol_t dhead; int dsize, ret, wbytes; strcpy(shead.file_name, file_name); strcpy(shead.cmd, "download"); wbytes = tcp_send_packet(cfd, &shead, sizeof(shead)); if (wbytes != sizeof(file_protocol_t)) { DEBUG_INFO("[ERROR] %s\n", strerror(errno)); return -1; } ret = recv_protocol_head(cfd, &dhead); if (ret == -1) return -1; dsize = recv_file_data(cfd, target_file_name, dhead.file_size); printf("download file size is %d\n", dsize); close(cfd); return dsize; }

得分 100
学习任务

zhuluoc 的学生作业:

linknode.h #ifndef __LINKNODE_H__ #define __LINKNODE_H__ #include #include #include //---------------------------------------------------- // 定义数据类型 typedef int data_t; // 定义链式栈节点结构体 typedef struct node { data_t data; struct node *next; } linknode_t; //---------------------------------------------------- #endif linkstack.h #ifndef __LINKSTACK_H__ #define __LINKSTACK_H__ #include "linknode.h" //---------------------------------------------------- // 定义链式栈结构体 typedef struct { linknode_t *top; // 栈顶指针 int icnt; // 当前栈中的元素 } linkstack_t; //---------------------------------------------------- extern linkstack_t *create_linkstack(); // 创建栈 extern int is_empty_linkstack(linkstack_t *s); // 是否为空栈 extern int push_linkstack(linkstack_t *s, data_t data); // 入栈 extern data_t pop_linkstack(linkstack_t *s); // 出栈 extern data_t get_top_data(linkstack_t *s); // 获取栈顶元素 #endif linkstack.c #include "linkstack.h" //---------------------------------------------------- // 创建栈 linkstack_t *create_linkstack() { // 创建空的链式栈,只有栈头,没有结点 linkstack_t *s = (linkstack_t *)malloc(sizeof(linkstack_t)); if (NULL == s) { printf("create link stack malloc error!\n"); return NULL; } s->top = NULL; s->icnt = 0; return s; } //---------------------------------------------------- // 是否为空栈 int is_empty_linkstack(linkstack_t *s) { return s->top == NULL; } //---------------------------------------------------- // 入栈 int push_linkstack(linkstack_t *s, data_t data) { linknode_t *t = (linknode_t *)malloc(sizeof(linknode_t)); if (NULL == t) { printf("create stack node malloc error!\n"); return -1; } t->data = data; t->next = s->top; // 入栈采用链表头插法 // 更新栈顶指针 s->top = t; // 更新栈元素个数 s->icnt++; return 0; } //---------------------------------------------------- // 出栈 data_t pop_linkstack(linkstack_t *s) { linknode_t *t = NULL; data_t data; // 保存要删除结点(栈顶元素) t = s->top; data = t->data; // 更新栈顶指针 s->top = t->next; // 释放结点 free(t); t = NULL; // 更新栈元素的个数 s->icnt--; return data; } //---------------------------------------------------- // 获取栈顶元素 data_t get_top_data(linkstack_t *s) { return s->top->data; } //---------------------------------------------------- linkqueue.h #ifndef __LINKQUEUE_H__ #define __LINKQUEUE_H__ #include "linknode.h" //---------------------------------------------------- // 队列长度:11(时) + 11(5分) + 4(分) + 1(队头节点) #define QULEN 27 typedef struct { linknode_t *front; linknode_t *rear; } linkqueue_t; //---------------------------------------------------- extern linkqueue_t *create_linkqueue(); // 创建队列 extern int is_empty_linkqueue(linkqueue_t *q); // 判断是否为空队列 extern void enter_linkqueue(linkqueue_t *q, data_t data); // 入队 extern data_t leave_linkqueue(linkqueue_t *q); // 出队 extern void print_linkqueue(linkqueue_t *q); // 遍历队列元素 extern int is_orginal_queue(linkqueue_t *q); // 判断队列是否回归到原始状态 #endif linkqueue.c #include "linkqueue.h" //---------------------------------------------------- // 创建队列 linkqueue_t *create_linkqueue() { linkqueue_t *q = NULL; linknode_t *h = NULL; // 创建队列头结点,指针域为空 h = (linknode_t *)malloc(sizeof(linknode_t)); if (NULL == h) { printf("link node create malloc error\n"); return NULL; } h->next = NULL; q = (linkqueue_t *)malloc(sizeof(linkqueue_t)); if (NULL == q) { printf("link queue create malloc error!\n"); return NULL; } // 队列的头指针和尾指针 初始化时均指向头结点 q->front = q->rear = h; return q; } //---------------------------------------------------- // 判断是否为空队列 int is_empty_linkqueue(linkqueue_t *q) { return q->front == q->rear; } //---------------------------------------------------- // 入队 void enter_linkqueue(linkqueue_t *q, data_t data) { linknode_t *t = (linknode_t *)malloc(sizeof(linknode_t)); if (NULL == t) { printf("link node create malloc error\n"); return; } t->data = data; // 使用链表尾插法入队 t->next = q->rear->next; q->rear->next = t; // 尾指针后移到最后 q->rear = t; } //---------------------------------------------------- // 出队 data_t leave_linkqueue(linkqueue_t *q) { linknode_t *t = NULL; data_t data; // 记录当前队头位置 t = q->front->next; data = t->data; // 释放队头指针 q->front->next = t->next; free(t); t = NULL; // 检查数据是否已出完 if (NULL == q->front->next) { q->rear = q->front; } return data; } //---------------------------------------------------- // 遍历队列元素 void print_linkqueue(linkqueue_t *q) { linknode_t *t = q->front->next; while (t) { printf("%-3d", t->data); t = t->next; } printf("\n"); } //---------------------------------------------------- // 判断是否回归到原始状态 int is_orginal_queue(linkqueue_t *q) { int i = 0; linknode_t *p = q->front->next; for (i = 1; i data) return 0; p = p->next; } return 1; } //---------------------------------------------------- main.c #include "linkqueue.h" #include "linkstack.h" int main() { int i = 0, half_day = 0; data_t ball = 0; linkstack_t *smin = NULL, *s5min = NULL, *shour = NULL; linkqueue_t *que = NULL; que = create_linkqueue(); if (NULL == que) return -1; // 按顺序初始化队列 for (i = 1; i icnt < 4) { // 如果分钟指示器没满,则将球入栈 push_linkstack(smin, ball); continue; } // 分钟栈满了,全部元素出栈并重新入队 while (!is_empty_linkstack(smin)) { enter_linkqueue(que, pop_linkstack(smin)); } // 5分钟栈没满栈时,将球入栈 if (s5min->icnt < 11) { push_linkstack(s5min, ball); continue; } // 当5分钱栈满时,全部出栈并重新入队 while(!is_empty_linkstack(s5min)) { enter_linkqueue(que, pop_linkstack(s5min)); } // 当时钟栈没满时,将球入栈 if (shour->icnt < 11) { push_linkstack(shour, ball); continue; } // 当时钟满时,全部出栈并重新入队 while (!is_empty_linkstack(shour)) { enter_linkqueue(que, pop_linkstack(shour)); } // 分钟、5分钟、时钟 栈均为满时,将球重新加入队列 enter_linkqueue(que, ball); half_day++; // // 检查队列是否重新回到最初状态 if (is_orginal_queue(que)) break; } printf("The queue restore to original need %d days\n", half_day / 2); return 0; } 输出结果: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 The number of days required to restore the original queue is 23 days

微信客服

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

帮助反馈 APP下载

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

公众号

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