int main(int argc, char** argv) { test_host_bits(); test_class(); test_mask(); test_broadcast(); test_is_valid_id(); return 0; }
int main(int argc, char **argv) { test_create_dynamic() ; test_create_static() ; test_thread_create() ; test_yield() ; test_wait() ; test_broadcast() ; test_pc() ; test_pc_big() ; test_recursive() ; test_sem() ; test_lock() ; test_func_pointer() ; test_ready() ; test_kill() ; test_reset() ; return 0 ; }
int main(int argc, char **argv) { int maxi, maxfd, listenfd, connfd, sockfd; int nready; ssize_t i, n; fd_set rset, allset; char buf[MAXLINE], str[INET_ADDRSTRLEN]; char climsg[100], nread; socklen_t clilen; struct sockaddr_in cliaddr, servaddr; struct client_info client[FD_SETSIZ]; FILE *fp, *ffp = stdin; if ((fp=fopen("test//msg.txt","w+"))==NULL) printf("Error in opening %s\n","msg.txt"), exit(1); else printf("File opening succeed\n"); //fputs("shaf dsfdsaf dgdasg gdasg", fp); //fclose(fp); int is_command = 0; if (argc != 2) { printf("Usage: %s <port>\n", argv[0]); exit(1); } /*初始socket*/ listenfd = socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr= htonl(INADDR_ANY); servaddr.sin_port = htons(atoi(argv[1])); /*命名socket*/ bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); /*監聽client端連線*/ listen(listenfd, LISTENQ); /*初始一些資料*/ maxfd = listenfd; maxi = -1; for (i = 0; i< FD_SETSIZ; i++) client[i].clientfd = -1; /*初始select集合*/ FD_ZERO(&allset); FD_SET(listenfd, &allset); FD_SET(fileno(ffp), &allset);//將鍵盤輸入檔案子加到集合裡 /*用迴圈方式一直處理client端要求*/ while(1) { rset = allset; nready = select(maxfd + 1, &rset, NULL, NULL, NULL); /*儲存使用者聊天紀錄並且關掉server*/ if(FD_ISSET(fileno(ffp), &rset))//當鍵盤輸入時為真 { ioctl(0,FIONREAD,&read);//輸入ctrl+D時會進入下列條件式 if(nread == 0) { printf("server shutdown\n"); fclose(fp); exit(1); } } /*如果會進入此迴圈,表示是server端發出的要求,有client要連線*/ if (FD_ISSET(listenfd, &rset)) { /*接受client端連線*/ clilen = sizeof(cliaddr); connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &clilen); /*儲存使用者資訊*/ for (i = 0; i < FD_SETSIZ; i++) if (client[i].clientfd < 0) { client[i].clientfd = connfd;//紀錄client端檔案子 memcpy(&client[i].cliaddr, &cliaddr, clilen); printf("client in: %s:%d [sock:%d]\n", inet_ntop(AF_INET, &client[i].cliaddr.sin_addr, str, sizeof(str)), ntohs(client[i].cliaddr.sin_port), client[i].clientfd); sprintf(climsg, "[client@%s:%d]===>\n", inet_ntop(AF_INET, &client[i].cliaddr.sin_addr, str, sizeof(str)), ntohs(client[i].cliaddr.sin_port)); broadcast(client, maxi, climsg, strlen(climsg));//通知所有上線人,該員登入 break;//當一個client[i]資訊儲存完,馬上離開 } #if 0 if (i == FD_SETSIZ) { printf("too many clients\n"); exit(1); } #endif if (i == FD_SETSIZ) { close(connfd); goto out_of_num; } FD_SET(connfd, &allset); if (connfd > maxfd) maxfd = connfd; if (i > maxi) maxi = i; out_of_num: if (--nready <= 0) continue; } /*反之,表示由client發的要求,傳送訊息或是離開聊天室*/ for (i = 0; i <= maxi; i++) { if ((sockfd = client[i].clientfd) < 0) continue; if (FD_ISSET(sockfd, &rset)) { /*client端離開聊天室*/ if ((n = read(sockfd, buf, MAXLINE)) == 0) { printf("client out: %s:%d [sock:%d]\n", inet_ntop(AF_INET, &client[i].cliaddr.sin_addr, str, sizeof(str)), ntohs(client[i].cliaddr.sin_port), client[i].clientfd); close(sockfd); FD_CLR(sockfd, &allset); client[i].clientfd = -1; //maxi--; sprintf(climsg, "[client@%s:%d]<===\n", inet_ntop(AF_INET, &client[i].cliaddr.sin_addr, str, sizeof(str)), ntohs(client[i].cliaddr.sin_port)); broadcast(client, maxi, climsg, strlen(climsg)); } else//client端傳送訊息 { #if 0 for (j = 0; j <= maxi; j++) { if (client[j].clientfd < 0) continue; write(client[j].clientfd, buf, n); } #endif sprintf(climsg, "[client@%s:%d]:", inet_ntop(AF_INET, &client[i].cliaddr.sin_addr, str, sizeof(str)), ntohs(client[i].cliaddr.sin_port)); buf[n-1] = '\0'; if(strcmp(buf,"//num") == 0)//顯示聊天室人數 { is_command = 1; test_broadcast(client, maxi, fp, i, is_command, buf);///TEST!!!! command(client, i, maxi, buf, n); } else if(strcmp(buf,"//exit") == 0)//離開聊天室 { printf("client out: %s:%d [sock:%d]\n", inet_ntop(AF_INET, &client[i].cliaddr.sin_addr, str, sizeof(str)), ntohs(client[i].cliaddr.sin_port), client[i].clientfd); close(sockfd); FD_CLR(sockfd, &allset); client[i].clientfd = -1; sprintf(climsg, "[client@%s:%d]<===\n", inet_ntop(AF_INET, &client[i].cliaddr.sin_addr, str, sizeof(str)), ntohs(client[i].cliaddr.sin_port)); broadcast(client, maxi, climsg, strlen(climsg)); is_command = 1; } else if(strcmp(buf,"//date") == 0)//顯示目前時間日期 { is_command = 1;//表示client端是傳送指令,將is_command設為1 test_broadcast(client, maxi, fp, i, is_command, buf);///TEST!!!! what_time(client, i, buf); } if(is_command==0)//如果is_command為0表示,client端址傳送聊天訊息 { is_command = 0;//清為0 test_broadcast(client, maxi, fp, i, is_command, buf);//TEST buf[n-1] = '\n'; broadcast(client, maxi, climsg, strlen(climsg)); broadcast(client, maxi, buf, n); } is_command = 0;//清為0 } if (--nready <= 0) break; } } } }