亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

作業社區

探索學習新天地,共享知識資源!

0 提交作業
0 布置作業
0 滿分作業
得分 100
學習任務

jelasin 的學生作業:

#include #include #include #include #include #include #include #include #include #include #include #define MAX_EVENTS 1024 #define BUFFER_SIZE 4096 #define WORKER_NUM 4 int create_udp_socket(int port) { int sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { perror("socket creation failed"); exit(EXIT_FAILURE); } struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(port); if (bind(sockfd, (struct sockaddr*)&addr, sizeof(addr)) < 0) { perror("bind failed"); close(sockfd); exit(EXIT_FAILURE); } return sockfd; } void *worker_thread(void *arg) { int sockfd = *(int *)arg; free(arg); // Free the allocated memory for the argument int epoll_fd = epoll_create1(0); if (epoll_fd < 0) { perror("epoll_create1 failed"); exit(EXIT_FAILURE); } struct epoll_event ev; ev.events = EPOLLIN; ev.data.fd = sockfd; if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, sockfd, &ev) < 0) { perror("epoll_ctl failed"); close(epoll_fd); exit(EXIT_FAILURE); } struct epoll_event events[MAX_EVENTS]; char buffer[BUFFER_SIZE]; struct sockaddr_in client_addr; socklen_t addr_len = sizeof(client_addr); while (1) { int nfds = epoll_wait(epoll_fd, events, MAX_EVENTS, -1); if (nfds < 0) { if (errno == EINTR) continue; perror("epoll_wait failed"); break; } for (int i = 0; i < nfds; i++) { if (events[i].data.fd == sockfd) { ssize_t recv_len = recvfrom(sockfd, buffer, BUFFER_SIZE, 0, (struct sockaddr*)&client_addr, &addr_len); if (recv_len < 0) { perror("recvfrom failed"); continue; } printf("Worker[%ld] received %zd bytes from %s:%d\n", pthread_self(), recv_len, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); // Echo back sendto(sockfd, buffer, recv_len, 0, (struct sockaddr*)&client_addr, addr_len); } } } close(epoll_fd); return NULL; } int main(int argc, char *argv[]) { if (argc != 2) { fprintf(stderr, "Usage: %s \n", argv[0]); exit(EXIT_FAILURE); } int port = atoi(argv[1]); int sockfd = create_udp_socket(port); pthread_t tids[WORKER_NUM]; for (int i = 0; i < WORKER_NUM; i++) { int *thread_sockfd = malloc(sizeof(int)); if (thread_sockfd == NULL) { perror("malloc failed"); exit(EXIT_FAILURE); } *thread_sockfd = sockfd; if (pthread_create(&tids[i], NULL, worker_thread, thread_sockfd) != 0) { perror("pthread_create failed"); exit(EXIT_FAILURE); } } printf("Server started with %d workers on port %d\n", WORKER_NUM, port); printf("Master process PID: %d\n", getpid()); for (int i = 0; i < WORKER_NUM; i++) { pthread_join(tids[i], NULL); } close(sockfd); return 0; }

得分 100
學習任務

qq_康斯坦丁_0 的學生作業:

#include #include #include #include #include #include #define TIMEOUT_SECONDS 3 #define MAX_TIMEOUT_COUNT 3 volatile int timeout_flag = 0; int timeout_count = 0; void timeout_handler(int signo) { timeout_flag = 1; } int main() { char buffer[256]; struct sigaction sa; fd_set readfds; struct timeval tv; int ret; // 設置SIGALRM信號處理函數 sa.sa_handler = timeout_handler; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; if (sigaction(SIGALRM, &sa, NULL) < 0) { perror("設置信號處理函數失敗"); exit(1); } printf("請輸入內容(在%d秒內):\n", TIMEOUT_SECONDS); while (timeout_count < MAX_TIMEOUT_COUNT) { FD_ZERO(&readfds); FD_SET(STDIN_FILENO, &readfds); // 設置超時時間 tv.tv_sec = TIMEOUT_SECONDS; tv.tv_usec = 0; // 重置超時標志 timeout_flag = 0; // 設置定時器 alarm(TIMEOUT_SECONDS); // 等待輸入或超時 ret = select(STDIN_FILENO + 1, &readfds, NULL, NULL, &tv); // 取消定時器 alarm(0); if (ret < 0) { perror("select錯誤"); exit(1); } else if (ret == 0 || timeout_flag) { // 超時 timeout_count++; printf("輸入超時?。ǖ?d次)\n", timeout_count); if (timeout_count < MAX_TIMEOUT_COUNT) { printf("請再次輸入(在%d秒內):\n", TIMEOUT_SECONDS); } } else { // 有輸入 if (fgets(buffer, sizeof(buffer), stdin) != NULL) { printf("您輸入的內容是:%s", buffer); timeout_count = 0; // 重置超時計數 printf("請繼續輸入(在%d秒內):\n", TIMEOUT_SECONDS); } } } printf("已連續超時%d次,程序退出!\n", MAX_TIMEOUT_COUNT); return 0; }

得分 100
學習任務

史啦啦 的學生作業:

#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; //1.給用戶回復的秘鑰正確信息 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; }

微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號