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

作业社区

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

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

北城半夏4806197 的学生作业:

serve.c #include #include #include #include #include /* See NOTES */ #include #include #include #include #include #include #define LOGIN_SUCCESS 1 #define LOGIN_FAILURE 0 typedef struct { char *ip; unsigned char flag; struct sockaddr_in *peer_addr; }thread_type; void printf_client_info(struct sockaddr_in *addr,char *buf) { printf("===============================\n"); printf("user IP : %s\n",inet_ntoa(addr->sin_addr)); printf("user port : %d\n", ntohs(addr->sin_port)); printf("user data : %s\n",buf); } //1.初始化socket连接 int init_socket(const char *ip,const char *port) { int sockfd = 0; struct sockaddr_in my_addr; socklen_t len = sizeof(my_addr); //1.通过socket创建文件描述符 sockfd = socket(AF_INET,SOCK_DGRAM ,0); if(sockfd < 0) { perror("Fail to socket!"); exit(EXIT_FAILURE); } //2.填充服务器自己的ip地址和port,然后绑定 memset(&my_addr,0,sizeof(my_addr)); my_addr.sin_family = AF_INET; my_addr.sin_port = htons(atoi(port)); my_addr.sin_addr.s_addr = inet_addr(ip); if(bind(sockfd,(struct sockaddr *)&my_addr,len) < 0) { perror("Fail to bind"); return -1; } return sockfd; } void recv_data(int new_sockfd) { int n = 0; char buf[1024] = {0}; struct sockaddr_in client_addr; socklen_t len = sizeof(client_addr); //3.发送数据 while(1) { memset(buf,0,sizeof(buf)); n = recvfrom(new_sockfd,buf,sizeof(buf),0,(struct sockaddr *)&client_addr,&len); if(n < 0) { perror("Fail to recvfrom"); exit(EXIT_FAILURE); } printf_client_info(&client_addr,buf); if(strncmp(buf,"quit",4) == 0) break; } close(new_sockfd); return ; } void *message_thread(void *arg) { thread_type *packet = (thread_type *)arg; char *ip = packet->ip; unsigned char login_flag = packet->flag; struct sockaddr_in *addr = packet->peer_addr; //创建套接字,获得用户数据,绑定0号端口,系统会随机分配一个可用的端口 int new_sockfd = init_socket(ip,"0"); sendto(new_sockfd,&login_flag,sizeof(login_flag),0,(struct sockaddr *)addr,sizeof(struct sockaddr_in)); recv_data(new_sockfd); pthread_exit(NULL); } void user_login(const char *ip,const char *port) { int n = 0; char buf[1024] = {0}; struct sockaddr_in client_addr; socklen_t len = sizeof(client_addr); unsigned char login_flag; int sockfd; thread_type packet; pthread_t tid; //1.创建套接字,获得用户数据 sockfd = init_socket(ip,port); //2.接收登录数据 while(1) { memset(buf,0,sizeof(buf)); n = recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&client_addr,&len); if(n < 0) { perror("Fail to recvfrom"); exit(EXIT_FAILURE); } printf("key = %s\n",buf); login_flag = (strncmp(buf,"root",4) == 0) ? LOGIN_SUCCESS : LOGIN_FAILURE; //说明此时秘钥正确 if(login_flag == LOGIN_SUCCESS) { packet.ip = (char *)ip; packet.flag = login_flag; packet.peer_addr = &client_addr; //创建子线程,子线程准备接收当前用户数据,主线程接续接收新用户的秘钥 pthread_create(&tid,NULL,message_thread,(void *)&packet); }else{ //秘钥不正确,使用原始端口回复信息 sendto(sockfd,&login_flag,sizeof(login_flag),0,(struct sockaddr *)&client_addr,len); } //把线程设置为分离式 pthread_detach(tid); } return ; } //./a.out ip port int main(int argc, const char *argv[]) { int sockfd; unsigned char login_flag; if(argc < 3) { fprintf(stderr,"Usage : %s ip port!\n",argv[0]); exit(EXIT_FAILURE); } //1.接收用户的秘钥,准备登录 user_login(argv[1],argv[2]); return 0; } client #include #include #include #include #include /* See NOTES */ #include #include #include #define LOGIN_SUCCESS 1 #define LOGIN_FAILURE 0 void user_login(int sockfd,struct sockaddr_in *addr,struct sockaddr_in *new_addr,int len) { int n = 0; char buf[1024] = {0}; unsigned char flag = LOGIN_FAILURE; //发送数据 while(1) { putchar('>'); memset(buf,0,sizeof(buf)); fgets(buf,sizeof(buf),stdin); buf[strlen(buf) - 1] = '\0'; //'\n'-->'\0' n = sendto(sockfd,buf,strlen(buf),0,(struct sockaddr *)addr,len); if(n < 0) { perror("Fail to sendto"); exit(EXIT_FAILURE); } recvfrom(sockfd,&flag,sizeof(flag),0,(struct sockaddr *)new_addr,&len); //说明登录成功,否则继续登录 if(flag == LOGIN_SUCCESS) break; } return ; } void send_message(int sockfd,struct sockaddr_in *addr,int addr_len) { int n = 0; char buf[1024] = {0}; //发送数据 while(1) { printf("Input : "); memset(buf,0,sizeof(buf)); fgets(buf,sizeof(buf),stdin); buf[strlen(buf) - 1] = '\0'; //'\n'-->'\0' n = sendto(sockfd,buf,strlen(buf),0,(struct sockaddr *)addr,addr_len); if(n < 0) { perror("Fail to sendto"); exit(EXIT_FAILURE); } if(strncmp(buf,"quit",4) == 0) break; } return ; } //./a.out ip port int main(int argc, const char *argv[]) { int sockfd = 0; struct sockaddr_in peer_addr; struct sockaddr_in server_addr; socklen_t len = sizeof(peer_addr); if(argc < 3) { fprintf(stderr,"Usage : %s ip port!\n",argv[0]); exit(EXIT_FAILURE); } //1.通过socket创建文件描述符 sockfd = socket(AF_INET,SOCK_DGRAM ,0); if(sockfd < 0) { perror("Fail to socket!"); exit(EXIT_FAILURE); } //2.填充服务器的ip地址和port,方便绑定 memset(&peer_addr,0,sizeof(peer_addr)); peer_addr.sin_family = AF_INET; peer_addr.sin_port = htons(atoi(argv[2])); peer_addr.sin_addr.s_addr = inet_addr(argv[1]); //3.发送登录数据 memset(&server_addr,0,sizeof(server_addr)); user_login(sockfd,&peer_addr,&server_addr,len); //4.发送交互数据 send_message(sockfd,&server_addr,len); //5.关闭文件描述符 close(sockfd); return 0; } 【图片】 【图片】

得分 100
学习任务

史啦啦 的学生作业:

【图片】 #include #include #include #include #include #include #include #define MAXEVENTS 10 #define FIFO_PATH "./fifo_epoll_ctl" int main(void) { int epfd,ret,fifo_fd; struct epoll_event ev; struct epoll_event ret_ev[MAXEVENTS]; char buffer[1024] = {0}; //创建有名管道 if(mkfifo(FIFO_PATH,0666) == -1 && errno != EEXIST) { perror("[ERROR] mkfifo(): "); exit(EXIT_FAILURE); } //以非阻塞模式打开管道 fifo_fd = open(FIFO_PATH,O_RDONLY | O_NONBLOCK); if(fifo_fd == -1) { perror("[ERROR] open(): "); exit(EXIT_FAILURE); } //创建epoll实例 epfd = epoll_create(1); if(epfd == -1) { perror("[ERROR] epoll_create(): "); close(fifo_fd); exit(EXIT_FAILURE); } //将管道文件描述符添加到epoll监听 ev.events = EPOLLIN |EPOLLHUP; //监听可读和挂起事件 ev.data.fd = fifo_fd; if(epoll_ctl(epfd,EPOLL_CTL_ADD,fifo_fd,&ev) == -1) { perror("[ERROR] epoll_ctl(): "); close(fifo_fd); close(epfd); exit(EXIT_FAILURE); } printf("Listening FIFO: %s\n",FIFO_PATH); while(1) { ret = epoll_wait(epfd,ret_ev,MAXEVENTS,1000); //1秒超时 if(ret == -1) { perror("[ERROR] epoll_wait(): "); break; } else if(ret == 0) { printf("Timeout.\n"); continue; } for(int i=0;i 0) { buffer[bytes_read] = '\0'; printf("Received: %s\n",buffer); } else if(bytes_read == -1 && errno != EAGAIN) { perror("[ERROR] read(): "); } } } } } close(fifo_fd); close(epfd); return 0; }

微信客服

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

帮助反馈 APP下载

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

公众号

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