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

作业社区

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

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

慕工程6300203 的学生作业:

client.c #include #include #include #include /* See NOTES */ #include #include #include #include int main(int argc, char* argv[]) { if(argc != 3) { printf("Usage : %s \n", argv[0]); exit(EXIT_FAILURE); } int sockfd, ret; struct sockaddr_in peer_addr; char buffer[1024] = {0}; char *p_buffer = NULL; int len = 0; sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1) { perror("[ERROR] socket"); exit(EXIT_FAILURE); } peer_addr.sin_family = AF_INET; peer_addr.sin_port = htons(atoi(argv[2])); peer_addr.sin_addr.s_addr = inet_addr(argv[1]); ret = connect(sockfd, (struct sockaddr*)&peer_addr, sizeof(peer_addr)); if(ret == -1) { perror("[ERROR] connect"); exit(EXIT_FAILURE); } while (1) { bzero(buffer, sizeof(buffer)); strcpy(buffer, "hello server"); len = strlen(buffer); p_buffer = (char *) malloc(len + 4); memcpy(p_buffer, &len, 4); memcpy(p_buffer + 4, buffer, len); send(sockfd, p_buffer, len + 4, 0); usleep(100); } close(sockfd); return 0; } server.c #include #include #include #include /* See NOTES */ #include #include #include #include #define BACKLOG 10 int main(int argc, char* argv[]) { if(argc != 3) { printf("Usage : %s \n", argv[0]); exit(EXIT_FAILURE); } int sockfd, ret, client_fd; struct sockaddr_in server_addr; struct sockaddr_in client_addr; int len = sizeof(client_addr); char buffer[1024] = {0}; int buffer_len, rbytes, total_recv_len; sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1) { perror("[ERROR] socket"); exit(EXIT_FAILURE); } bzero(&server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(atoi(argv[2])); server_addr.sin_addr.s_addr = inet_addr(argv[1]); ret = bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)); if(ret == -1) { perror("[ERROR] bind"); close(sockfd); exit(EXIT_FAILURE); } ret = listen(sockfd, BACKLOG); if(ret == -1) { perror("[ERROR] listen"); close(sockfd); exit(EXIT_FAILURE); } bzero(&client_addr, sizeof(client_addr)); client_fd = accept(sockfd, (struct sockaddr*)&client_addr, &len); if(ret == -1) { perror("[ERROR] accept"); close(sockfd); exit(EXIT_FAILURE); } while (1) { bzero(buffer, sizeof(buffer)); recv(client_fd, &buffer_len, 4, 0); total_recv_len = 0; while (1) { rbytes = recv(client_fd, buffer + total_recv_len, buffer_len - total_recv_len, 0); if(rbytes > 0) { total_recv_len += rbytes; if(buffer_len == total_recv_len) break; } } printf("recv data: %s\n", buffer); sleep(1); } close(sockfd); close(client_fd); return 0; }

得分 100
学习任务

慕工程6300203 的学生作业:

client.c #include #include #include #include /* See NOTES */ #include #include #include #include int main(int argc, char* argv[]) { if(argc != 3) { printf("Usage : %s \n", argv[0]); exit(EXIT_FAILURE); } int sockfd, ret; struct sockaddr_in peer_addr; char buffer[1024] = {0}; sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1) { perror("[ERROR] socket"); exit(EXIT_FAILURE); } peer_addr.sin_family = AF_INET; peer_addr.sin_port = htons(atoi(argv[2])); peer_addr.sin_addr.s_addr = inet_addr(argv[1]); ret = connect(sockfd, (struct sockaddr*)&peer_addr, sizeof(peer_addr)); if(ret == -1) { perror("[ERROR] connect"); exit(EXIT_FAILURE); } while (1) { bzero(buffer, sizeof(buffer)); strcpy(buffer, "hello server"); send(sockfd, buffer, strlen(buffer), 0); usleep(100); } close(sockfd); return 0; } server.c #include #include #include #include /* See NOTES */ #include #include #include #include #define BACKLOG 10 int main(int argc, char* argv[]) { if(argc != 3) { printf("Usage : %s \n", argv[0]); exit(EXIT_FAILURE); } int sockfd, ret, client_fd; struct sockaddr_in server_addr; struct sockaddr_in client_addr; int len = sizeof(client_addr); char buffer[1024] = {0}; sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1) { perror("[ERROR] socket"); exit(EXIT_FAILURE); } bzero(&server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(atoi(argv[2])); server_addr.sin_addr.s_addr = inet_addr(argv[1]); ret = bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)); if(ret == -1) { perror("[ERROR] bind"); close(sockfd); exit(EXIT_FAILURE); } ret = listen(sockfd, BACKLOG); if(ret == -1) { perror("[ERROR] listen"); close(sockfd); exit(EXIT_FAILURE); } bzero(&client_addr, sizeof(client_addr)); client_fd = accept(sockfd, (struct sockaddr*)&client_addr, &len); if(ret == -1) { perror("[ERROR] accept"); close(sockfd); exit(EXIT_FAILURE); } while (1) { bzero(buffer, sizeof(buffer)); recv(client_fd, buffer, sizeof(buffer), 0); printf("recv data: %s\n", buffer); sleep(1); if (strncmp(buffer, "quit", 4) == 0) break; } close(sockfd); close(client_fd); return 0; }

得分 100
学习任务

慕工程6300203 的学生作业:

client.c #include #include #include #include /* See NOTES */ #include #include #include #include int main(int argc, char* argv[]) { if(argc != 3) { printf("Usage : %s \n", argv[0]); exit(EXIT_FAILURE); } int sockfd, ret; struct sockaddr_in peer_addr; char buffer[1024] = {0}; sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1) { perror("[ERROR] socket"); exit(EXIT_FAILURE); } peer_addr.sin_family = AF_INET; peer_addr.sin_port = htons(atoi(argv[2])); peer_addr.sin_addr.s_addr = inet_addr(argv[1]); ret = connect(sockfd, (struct sockaddr*)&peer_addr, sizeof(peer_addr)); if(ret == -1) { perror("[ERROR] connect"); exit(EXIT_FAILURE); } while (1) { bzero(buffer, sizeof(buffer)); printf(">"); fgets(buffer, sizeof(buffer), stdin); buffer[strlen(buffer) - 1] = '\0'; send(sockfd, buffer, strlen(buffer), 0); bzero(buffer, sizeof(buffer)); recv(sockfd, buffer, sizeof(buffer), 0); printf("recv: %s\n", buffer); if (strncmp(buffer, "quit", 4) == 0) break; } close(sockfd); return 0; } server.c #include #include #include #include /* See NOTES */ #include #include #include #include #define BACKLOG 10 int main(int argc, char* argv[]) { if(argc != 3) { printf("Usage : %s \n", argv[0]); exit(EXIT_FAILURE); } int sockfd, ret, client_fd; struct sockaddr_in server_addr; struct sockaddr_in client_addr; int len = sizeof(client_addr); char buffer[1024] = {0}; sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1) { perror("[ERROR] socket"); exit(EXIT_FAILURE); } bzero(&server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(atoi(argv[2])); server_addr.sin_addr.s_addr = inet_addr(argv[1]); ret = bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)); if(ret == -1) { perror("[ERROR] bind"); close(sockfd); exit(EXIT_FAILURE); } ret = listen(sockfd, BACKLOG); if(ret == -1) { perror("[ERROR] listen"); close(sockfd); exit(EXIT_FAILURE); } bzero(&client_addr, sizeof(client_addr)); client_fd = accept(sockfd, (struct sockaddr*)&client_addr, &len); if(ret == -1) { perror("[ERROR] accept"); close(sockfd); exit(EXIT_FAILURE); } while (1) { bzero(buffer, sizeof(buffer)); recv(client_fd, buffer, sizeof(buffer), 0); printf("recv data: %s\n", buffer); send(client_fd, buffer, strlen(buffer), 0); if (strncmp(buffer, "quit", 4) == 0) break; } close(sockfd); close(client_fd); return 0; }

得分 100
学习任务

学无止境呀呀呀 的学生作业:

#include #include #include #include #include #include #include #include #define size 1024 struct shmseg { size_t nbytes; char data[size]; }; int main(void) { int shmid; char src[256]; char dst[256]; //创建k key_t k = ftok(".",2); if(k == -1) { perror("[ERROR] ftok:"); exit(EXIT_FAILURE); } //创建共享内存 shmid = shmget(k,sizeof (struct shmseg),IPC_CREAT|0666); if(shmid == -1) { perror("[ERROR] shmid:"); exit(EXIT_FAILURE); } //关联映射 struct shmseg *seg = shmat(shmid,NULL,0); if(seg == (void *)-1) { perror("shmat():"); exit(EXIT_FAILURE); } printf("请输入要传输的文件和目的地:\n"); fflush(stdout); if(scanf("%s%s",src,dst) != 2){ printf("请输入要传输的文件和目的地(空格分离):\n"); exit(EXIT_FAILURE); } pid_t child = fork(); if(child == -1) { perror("fork():"); exit(EXIT_FAILURE); } else if(child == 0) { char buff[size]; size_t rbytes; //子进程 //发送文件 FILE *in = fopen(src,"r"); if(!in) { perror("fopen():"); exit(EXIT_FAILURE); } //把文件in里的数据读到seg->data,记录读了多少字节 seg->nbytes = fread(seg->data,sizeof(char),size,in); if(seg->nbytes == 0 && ferror(in)) { perror("read"); fclose(in); exit(EXIT_FAILURE); } printf("子进程存入完毕, 共%ld字节\n",seg->nbytes); fclose(in); exit(EXIT_SUCCESS); } else { waitpid(child,NULL,0);//等待子进程执行结束 //读取文件 FILE *out = fopen(dst,"wb"); if(!out) { perror("fopen(dst)"); exit(EXIT_FAILURE); } //把seg->data里有效字节写入out文件 if(fwrite(seg->data,sizeof(char),seg->nbytes,out) != seg->nbytes) { perror("write():"); fclose(out); exit(EXIT_FAILURE); } printf("父进程写入完毕,共%ld字节\n",seg->nbytes); fclose(out); } //解除映射 if(shmdt(seg) == -1) { perror("shmdt():"); exit(EXIT_FAILURE); } //删除共享内存shmctl int ret = shmctl(shmid,IPC_RMID,NULL); if(ret == -1) { perror("shmctl():"); exit(EXIT_FAILURE); } return 0; }

得分 100
学习任务

慕工程6300203 的学生作业:

#include #include #include #include #include #include #include #include #include #include #include #define LOGIN_SUCCESS 1 #define LOGIN_FAILURE 0 typedef struct { char *ip; int login_flag; struct sockaddr_in peer_addr; } pthread_argv_t; void recv_data(int fd) { char buffer[1024] = {0}; struct sockaddr_in client_addr; socklen_t len = sizeof(client_addr); int ret = 0; while(1) { memset(buffer, 0, sizeof(buffer)); ret = recvfrom(fd, buffer, sizeof(buffer), 0, (struct sockaddr *)&client_addr, &len); if (ret < 0) { perror("[ERROR] recvfrom"); exit(EXIT_FAILURE); } printf("============================\n"); printf("Recvfrom IP: %s\n", inet_ntoa(client_addr.sin_addr)); printf("Recvfrom PORT: %d\n", ntohs(client_addr.sin_port)); printf("Received data: %s\n", buffer); if (strncmp(buffer, "quit", 4) == 0) break; } close(fd); } int init_socket(char *ip, char *port) { int socket_fd; struct sockaddr_in connect_addr; int ret; socket_fd = socket(AF_INET, SOCK_DGRAM, 0); if(socket_fd == -1) { perror("[ERROR] Socket Create Failed"); exit(EXIT_FAILURE); } memset(&connect_addr, 0, sizeof(connect_addr)); connect_addr.sin_family = AF_INET; connect_addr.sin_port = htons(atoi(port)); connect_addr.sin_addr.s_addr = inet_addr(ip); ret = bind(socket_fd, (struct sockaddr *)&connect_addr, sizeof(connect_addr)); if (ret < 0) { perror("[ERROR] Bind Failed"); exit(EXIT_FAILURE); } return socket_fd; } void *thread_func(void *arg) { pthread_argv_t *pthread_argv = (pthread_argv_t *)arg; char *ip = pthread_argv->ip; struct sockaddr_in client_addr = pthread_argv->peer_addr; int login_flag = pthread_argv->login_flag; int len = sizeof(client_addr); int new_socket_fd = init_socket(ip,"0"); sendto(new_socket_fd, &login_flag, sizeof(login_flag), 0, (struct sockaddr *)&client_addr, len); recv_data(new_socket_fd); pthread_exit(NULL); } void user_login(char *ip, char *port) { int socket_fd; // 这里原本定义指针,到thread_func中后,由于user_login已经结束, // 这个局部变量失效了,导致服务端发送登录成功消息时,客户端无法接收到信息 struct sockaddr_in client_addr; int len = sizeof(client_addr); int ret = 0; pthread_t tid; pthread_argv_t pthread_argv; char buffer[1024] = {0}; int login_flag = LOGIN_FAILURE; socket_fd = init_socket(ip, port); printf("wait for login\n"); while(1) { memset(buffer, 0, sizeof(buffer)); ret = recvfrom(socket_fd, buffer, sizeof(buffer), 0, (struct sockaddr *)&client_addr, &len); if (ret < 0) { perror("[ERROR] Recv Failed"); exit(EXIT_FAILURE); } printf("key = %s\n", buffer); login_flag = strncmp(buffer, "password", 8) == 0 ? LOGIN_SUCCESS : LOGIN_FAILURE; if (login_flag == LOGIN_SUCCESS) { pthread_argv.login_flag = login_flag; pthread_argv.ip = ip; pthread_argv.peer_addr = client_addr; pthread_create(&tid, NULL, thread_func, &pthread_argv); } else { sendto(socket_fd, &login_flag, sizeof(login_flag), 0, (struct sockaddr *)&client_addr, len); } pthread_detach(tid); } } int main(int argc, char* argv[]) { if(argc != 3) { printf("Usage : %s \n", argv[0]); exit(EXIT_FAILURE); } user_login(argv[1], argv[2]); return 0; }

得分 100
学习任务

慕工程6300203 的学生作业:

#include #include #include #include #include #include #include #include #include #include #define LOGIN_SUCCESS 1 #define LOGIN_FAILURE 0 void recv_data(int fd) { char buffer[1024] = {0}; struct sockaddr_in client_addr; int len = sizeof(client_addr); int ret; while(1) { memset(buffer, 0, sizeof(buffer)); ret = recvfrom(fd, buffer, sizeof(buffer), 0, (struct sockaddr *)&client_addr, &len); if (ret < 0) { perror("[ERROR] recvfrom"); exit(EXIT_FAILURE); } printf("============================\n"); printf("Recvfrom IP: %s\n", inet_ntoa(client_addr.sin_addr)); printf("Recvfrom PORT: %d\n", ntohs(client_addr.sin_port)); printf("Received data: %s\n", buffer); if (strncmp(buffer, "quit", 4) == 0) break; } close(fd); exit(EXIT_SUCCESS); } int init_socket(char *ip, char *port) { int socket_fd; struct sockaddr_in connect_addr; int ret; socket_fd = socket(AF_INET, SOCK_DGRAM, 0); if(socket_fd == -1) { perror("[ERROR] Socket Create Failed"); exit(EXIT_FAILURE); } memset(&connect_addr, 0, sizeof(connect_addr)); connect_addr.sin_family = AF_INET; connect_addr.sin_port = htons(atoi(port)); connect_addr.sin_addr.s_addr = inet_addr(ip); ret = bind(socket_fd, (struct sockaddr *)&connect_addr, sizeof(connect_addr)); if (ret < 0) { perror("[ERROR] Bind Failed"); exit(EXIT_FAILURE); } return socket_fd; } int user_login(char *ip, char *port) { int socket_fd, new_socket_fd; struct sockaddr_in client_addr; int len = sizeof(client_addr); int ret; pid_t cpid; char buffer[20] = {0}; int login_flag = LOGIN_FAILURE; socket_fd = init_socket(ip, port); while(1) { memset(buffer, 0, sizeof(buffer)); ret = recvfrom(socket_fd, buffer, sizeof(buffer), 0, (struct sockaddr *)&client_addr, &len); if (ret < 0) { perror("[ERROR] Recv Failed"); exit(EXIT_FAILURE); } login_flag = strncmp(buffer, "password", 8) == 0 ? LOGIN_SUCCESS : LOGIN_FAILURE; if (login_flag == LOGIN_SUCCESS) { cpid = fork(); if(cpid == 0) { close(socket_fd); new_socket_fd = init_socket(ip,"0"); sendto(new_socket_fd, &login_flag, sizeof(login_flag), 0, (struct sockaddr *)&client_addr, len); break; } } else { sendto(socket_fd, &login_flag, sizeof(login_flag), 0, (struct sockaddr *)&client_addr, len); } } return new_socket_fd; } void sig_handle(int signum) { waitpid(-1, NULL, WNOHANG); printf("recv singnum = %d zombie\n", signum); } int main(int argc, char* argv[]) { if(argc != 3) { printf("Usage : %s \n", argv[0]); exit(EXIT_FAILURE); } if (signal(SIGCHLD, sig_handle) == SIG_ERR) { perror("[ERROR] Signal Handle Error"); return -1; } int socket_fd = user_login(argv[1], argv[2]); recv_data(socket_fd); return 0; }

得分 100
讨论题

zhuluoc 的学生作业:

// linkstack.h #ifndef __SEQSTACK_H__ #define __SEQSTACK_H__ #include #include #include typedef char data_t; typedef struct node { data_t data; struct node *next; } stacknode_t; // 顺序栈数据类型 typedef struct { stacknode_t *top; // 栈顶指针 int icnt; // 栈中元素个数 } linkstack_t; //------------------------------------------------ // 创建空栈 extern linkstack_t * create_seqstack(); // 判断栈是否为空 extern int is_empty_seqstack(linkstack_t *s); // 元素入栈 extern int push_seqstack(linkstack_t *s, data_t data); // 元素出栈 extern data_t pop_seqstack(linkstack_t *s); // 获得栈顶元素 extern data_t top_seqstack(linkstack_t *s); #endif // linkstack.c #include "linkstack.h" // 创建空栈 linkstack_t * create_seqstack() { linkstack_t *s = (linkstack_t *)malloc(sizeof(linkstack_t)); if (NULL == s) { printf("malloc error!\n"); return NULL; } memset(s, 0, sizeof(linkstack_t)); s->top = NULL; // 设置为栈 s->icnt = 0; return s; } //------------------------------------------------ // 判断栈是否为空 int is_empty_seqstack(linkstack_t *s) { return (s->top == NULL ? 1 : 0); } //------------------------------------------------ // 元素入栈 int push_seqstack(linkstack_t *s, data_t data) { stacknode_t *t = NULL; t = (stacknode_t *)malloc(sizeof(stacknode_t)); if (NULL == t) { printf("malloc error!\n"); return -1; } t->data = data; // 插入数据 t->next = s->top; s->top = t; s->icnt++; return 0; } //------------------------------------------------ // 元素出栈 data_t pop_seqstack(linkstack_t *s) { data_t data; stacknode_t *t = NULL; // 取出栈顶指针 t = s->top; // 更新栈顶指针 s->top = t->next; data = t->data; free(t); t = NULL; s->icnt--; return data; } //------------------------------------------------ // 获得栈顶元素 data_t top_seqstack(linkstack_t *s) { return s->top->data; } //------------------------------------------------ // main.c #include "linkstack.h" int main() { int i = 0; data_t ret = 0; data_t data[] = {'a','n','i','h','c',' ','e','v','o','l',' ','I'}; // 创建顺序栈 linkstack_t *s = create_seqstack(); if (NULL == s) return -1; for (i = 0; i < sizeof(data) / sizeof(data[0]); i++) { push_seqstack(s, data[i]); } printf("pop stack:\n"); while (!is_empty_seqstack(s)) { ret = pop_seqstack(s); printf("%c ", ret); } printf("\n"); return 0; } 输出结果: pop stack: I l o v e c h i n a

微信客服

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

帮助反馈 APP下载

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

公众号

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