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

作业社区

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

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

别摸我的键盘 的学生作业:

服务器代码 #include #include #include #include /* See NOTES */ #include #include #include #include #include #include #include #include #include #define MSG_SZ 128 #define LOGIN_FAIL_STATE 0 #define LOGIN_SUCCESS_STATE 1 void printf_data_info(struct sockaddr_in * addr_in, char *buf){ printf("=======================================================\n"); printf("host is %s\n", inet_ntoa(addr_in -> sin_addr)); printf("port is %d\n", ntohs(addr_in -> sin_port)); printf("buf content is %s\n", buf); printf("=======================================================\n"); } int socket_init(const char *ip, const char *port){ int socket_fd; struct sockaddr_in addr_in; int ret; socket_fd = socket(AF_INET, SOCK_DGRAM, 0); if(socket_fd == -1){ perror("[ERROR] socket()"); exit(EXIT_FAILURE); } memset(&addr_in, 0, sizeof(addr_in)); addr_in.sin_family = AF_INET; addr_in.sin_port = htons(atoi(port)); addr_in.sin_addr.s_addr = inet_addr(ip); ret = bind(socket_fd, (const struct sockaddr*)&addr_in, sizeof(addr_in)); if(ret == -1){ perror("[ERROR] bind()"); exit(EXIT_FAILURE); } return socket_fd; } void recv_data(int sc_fd){ struct sockaddr_in addr_in; char buf[MSG_SZ] = {0}; int len = sizeof(addr_in); while(1){ memset(buf, 0, sizeof(buf)); recvfrom(sc_fd, buf, sizeof(buf), 0, (struct sockaddr *)&addr_in, &len); printf_data_info(&addr_in, buf); if(strncmp(buf, "quit",4) == 0){ break; } } close(sc_fd); exit(EXIT_SUCCESS); } int user_login(const char *ip, const char *port){ struct sockaddr_in addr_in; char buf[MSG_SZ]={0}; int len = sizeof(addr_in); ssize_t sz; int login_state = LOGIN_FAIL_STATE; int socket_new_fd, socket_fd; socket_fd = socket_init(ip, port); while(1){ memset(buf, 0, MSG_SZ); sz = recvfrom(socket_fd, buf, sizeof(buf), 0, (struct sockaddr *) &addr_in, &len); if(-1 == sz){ perror("[ERROR] recvfrom()"); exit(EXIT_FAILURE); } printf("password is %s\n", buf); login_state = (strncmp(buf, "root", 4) == 0 ? LOGIN_SUCCESS_STATE : LOGIN_FAIL_STATE); if(login_state == LOGIN_SUCCESS_STATE){ if(fork() == 0){ printf("login successful!\n"); //login successful close(socket_fd); //指定端口为0 操作系统会随机分配可用端口 socket_new_fd = socket_init(ip, "0"); sendto(socket_new_fd, &login_state, sizeof(login_state),0,(struct sockaddr *) &addr_in, len); break; } }else{ sendto(socket_fd, &login_state, sizeof(login_state),0,(struct sockaddr *) &addr_in, len); } } return socket_new_fd; } void deal_signal(int signum){ waitpid(-1,NULL,WNOHANG); printf("recv singnum = %d zombie\n",signum); return ; } int main(int argc, const char *argv[]) { if(argc != 3){ fprintf(stderr, "[ERROR] %s \n", argv[0]); exit(EXIT_FAILURE); } if(signal(SIGCHLD, deal_signal) == SIG_ERR){ perror("[ERROR] signal"); exit(EXIT_FAILURE); } int socket_fd; int socket_new_fd; socket_new_fd = user_login(argv[1],argv[2]); recv_data(socket_new_fd); return 0; }

微信客服

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

帮助反馈 APP下载

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

公众号

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