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

作业社区

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

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; }

微信客服

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

帮助反馈 APP下载

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

公众号

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