示例#1
0
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 ;
}
示例#3
0
文件: server.c 项目: c0p0u0/chat
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;
			}
		}
	}
}