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

作业社区

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

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

weixin_慕哥3021856 的学生作业:

#include #include #include #include #include #include #include #include #include #include #define LOGIN_SUCCESS 1 #define LOGIN_FAILURE 0 void recv_data(int sockfd) { int n = 0; char buf[1024] = {0}; struct sockaddr_in server_addr; int len = sizeof(server_addr); while (1) { memset(buf, 0, sizeof(buf)); n = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&server_addr, &len); if (n < 0) { perror("recvfrom failed.\n"); exit(EXIT_FAILURE); } if (strncmp(buf, "quit", 4) == 0) { printf("Bye!\n"); break; } printf("--------------------\n"); printf("Recv from IP: %s\n", inet_ntoa(server_addr.sin_addr)); printf("Recv from port: %d\n", ntohs(server_addr.sin_port)); printf("Recv %d bytes : %s\n", n, buf); } close(sockfd); exit(EXIT_SUCCESS); } int init_socket(const char *ip, const char *port) { int sockfd; struct sockaddr_in saddr; int len = sizeof(saddr); // 创建文件描述符 sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { perror("socket failed.\n"); exit(EXIT_FAILURE); } // 绑定服务器本身的ip和port memset(&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = inet_addr(ip); saddr.sin_port = htons(atoi(port)); // 将ip和port与socket绑定在一起 if (bind(sockfd, (struct sockaddr *)&saddr, len) < 0) { perror("bind failed.\n"); exit(EXIT_FAILURE); } printf("Wait to receive data...\n"); return sockfd; } int user_login(const char *ip, const char *port) { int sockfd, n = 0; int new_sockfd; unsigned char loginfg; char buffer[16] = {0}; struct sockaddr_in caddr; int len = sizeof(caddr); sockfd = init_socket(ip, port); // 接收登录信息,登录成功后父进程负责验证密钥信息,子进程负责与用户进行数据交互 while (1) { memset(buffer, 0, sizeof(buffer)); n = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&caddr, &len); if (n < 0) { perror("recvfrom user's sercet key failed.\n"); exit(EXIT_FAILURE); } printf("Secret key = %s\n", buffer); loginfg = (strncmp(buffer, "root", 4) == 0)? LOGIN_SUCCESS: LOGIN_FAILURE; if (loginfg == LOGIN_SUCCESS) { if (fork() == 0) { close(sockfd); // 绑定0号端口,系统会随机分配一个可用的端口 new_sockfd = init_socket(ip, "0"); // 回复登录成功 printf("login successfully.\n"); sendto(new_sockfd, &loginfg, sizeof(loginfg), 0, (struct sockaddr *)&caddr, len); break; } } else { // 回复登录失败 sendto(sockfd, &loginfg, sizeof(loginfg), 0, (struct sockaddr *)&caddr, len); } } return new_sockfd; } void sig_handler(int signum) { waitpid(-1, NULL, WNOHANG); printf("The main process receives signum = %d.\n", signum); } int main(int argc, const char *argv[]) { int sockfd; if (argc != 3) { fprintf(stderr, "Usage: %s server_ip server_port\n", argv[0]); exit(EXIT_FAILURE); } // 回收子进程 if (signal(SIGCHLD, sig_handler) == SIG_ERR) { perror("[Error] signal()"); return -1; } sockfd = user_login(argv[1], argv[2]); recv_data(sockfd); return 0; } 【图片】

得分 100
学习任务

胡汉三66 的学生作业:

#include //标准I/O函数 #include //exit函数 #include //字符串操作 #include //wait函数 fork函数 #include //pipe函数 write函数 read函数 close函数 fork函数 #include //wait函数 int main(void) { pid_t cpid; int ret; int pipefd[2]; char bu_a[64] = {0}; for(;;) //循环输入 "quit"退出 { printf("Pipe write data > "); fgets(bu_a,64,stdin);//从键盘读取一行字符,保存在数组bu_a中 bu_a[strlen(bu_a) - 1] = '\0';//將字符串中的"\n"换成"\0" //"quit" : 退出标识 if(strncmp(bu_a,"quit",4) == 0) { printf("GoodBye!\n"); break; } ret = pipe(pipefd);//创建管道后,内核会将 文件描述符 储存 到 数组pipefd 中 if(ret == -1) { perror("[ERROR] pipe() : "); exit(EXIT_FAILURE); } cpid = fork();//创建子进程 if (cpid == -1) { perror("[ERROR] fork() : "); exit(EXIT_FAILURE); }else if (cpid == 0) //子进程 从管道中读取数据 { ssize_t rbytes; char bu_b[64] = {0}; close(pipefd[1]); //关闭 子进程 写端 文件描述符 //从管道中读取数据,保存在数组buffer中 //如果管道中没有数据,子进程会阻塞 rbytes = read(pipefd[0],bu_b,sizeof(bu_b) - 1); if (rbytes == -1) { perror("[ERROR] read(): "); close(pipefd[0]); exit(EXIT_FAILURE); } bu_b[rbytes] = '\0';//确保字符串以'\0'结尾 printf("Pipe read data : %s\n",bu_b);//打印 从管道读取的 数据 close(pipefd[0]); //关闭 子进程 读端 文件描述符 exit(EXIT_SUCCESS); }else if (cpid > 0) //父进程 写入数据到管道中 { ssize_t wbytes; close(pipefd[0]); //关闭 父进程 读端 文件描述符 //把数组buffer中的数据,写入到管道中 wbytes = write(pipefd[1],bu_a,strlen(bu_a)); if (wbytes == -1) { perror("[ERROR] write(): "); close(pipefd[1]); exit(EXIT_FAILURE); } close(pipefd[1]); //关闭 父进程 写端 文件描述符 wait(NULL); //等待子进程退出 } } return 0; } 【图片】

微信客服

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

帮助反馈 APP下载

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

公众号

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