Example #1
0
int main(int argc, char* argv[])
{
	if(argc != 3)
	{
		printf("Usage: %s [local_ip] [local_port]\n",argv[0]);
		exit(4);
	}

	//设置监听套接字
	int listen_sock = statup(argv[1], argv[2]);
	printf("listen_sock = %d \n",listen_sock);

	//初始化poll结构体
	struct pollfd fds[_SIZE_];
	int i = 0;
	for(; i < _SIZE_; i++)
	{
		fds[i].fd = -1;
		fds[i].events = 0;
		fds[i].revents = 0;
	}
	
	fds[0].fd = listen_sock;
	fds[0].events = POLLIN;

	while(1)
	{
		int timeout = 5000;//5秒,毫秒为单位
		switch(poll(fds, _SIZE_, timeout))
		{
		case 0:
			printf("timeout...\n");
			break;
		case -1:
			perror("poll");
			break;
		default:
		{
			int j = 0;
			for(; j < _SIZE_; j++)
			{
				if(fds[i].fd < 0)
				{
					continue;
				}
				if((j == 0) && (fds[j].revents & POLLIN))
				{
					//监听到一个新链接
					struct sockaddr_in peer;
					socklen_t len = sizeof(peer);

					int new_sock = accept(listen_sock, (struct sockaddr*)&peer,&len);
					if(new_sock < 0)
					{
						perror("accept");
						exit(5);
					}

					printf("get new client# %s:%d\n",inet_ntoa(peer.sin_addr), ntohs(peer.sin_port));
				
					//将监听到的套接字赋到poll结构体中
					int k = 0;
					for(; k < _SIZE_; k++)
					{
						if(fds[k].fd < 0)
						{
							fds[k].fd = new_sock;
							fds[k].events = POLLIN;
							break;
						}
					}

					if(k == _SIZE_)
					{
						printf("full...\n");
						close(new_sock);
					}
				}//if
				else if(fds[j].revents & POLLIN)
				{
					char buf[1024];
					ssize_t _s = read(fds[j].fd, buf, sizeof(buf)-1);

					if(_s > 0)
					{
						buf[_s-1] = '\0';
						printf("client# %s\n",buf);
					}
					else if(_s == 0)
					{
						printf("client is quit...\n");
						close(fds[j].fd);
						
						fds[j].fd = -1;
						fds[j].events = 0;
						fds[j].revents = 0;
					}
					else
					{
						perror("read");
						exit(6);
					}
				}//else if
			}
		}//default
			break;
		}//switch
	}


	return 0;
}
Example #2
0
File: server.c Project: Zxiaoxue/c-
int main(int argc, char* argv[])
{
	if(argc != 3)
	{
		printf("Usage: %s [local_ip] [local_port]",argv[0]);
		exit(4);
	}

	int listen_sock = statup(argv[1],atoi(argv[2]));
	//shezhiweiwuxiao
	int i = 0;
	for(; i<_SIZE_; i++)
	{
		gfd[i] = -1;
	}

	int index = 0;
	gfd[index++] = listen_sock;



	while(1)
	{
		struct timeval timeout = {5,0};
		fd_set rfds;
		FD_ZERO(&rfds);//clear rfds

		int j = 0;
		int max_fd = -1;
		for(; j<_SIZE_; j++)
		{
			if(gfd[j] > 0)
			{
				FD_SET(gfd[j], &rfds);
				if(max_fd < gfd[j])
				{
					max_fd = gfd[j];
				}
			}
		}

		switch(select(max_fd+1, &rfds, NULL, NULL, &timeout))
		{
			case 0:
				perror("time out");
				break;
			case -1:
				perror("select");
				break;
			default:
				{
					int k = 0;
					for(; k<_SIZE_; k++)
					{
						if(gfd[k] < 0)
						{
							continue;
						}
						if(k==0 && FD_ISSET(listen_sock, &rfds))
						{
							struct sockaddr_in peer;
							socklen_t len = sizeof(peer);
							int sock = accept(listen_sock, (struct sockaddr*)&peer, &len);
							if(sock < 0)
							{
								perror("accept");
								exit(5);
							}
							if(sock > 0)
							{
								printf("get a new client ip:%s port:%d\n",inet_ntoa(peer.sin_addr),\
										ntohs(peer.sin_port));
								int m = 0;
								for(; m<_SIZE_; m++)
								{
									if(gfd[m] == -1)
									{
										gfd[m] = sock;
										break;
									}

								}
								if(m == _SIZE_)
								{
									printf("m == _SZIE_\n");
									close(sock);
								}
							}
						}
						else if(FD_ISSET(gfd[k], &rfds))
						{
							char buf[1024];
							memset(buf, 0, sizeof(buf)-1);
							ssize_t _s = read(gfd[k], buf, sizeof(buf)-1);
							if(_s > 0)
							{
								printf("client# %s\n", buf);
							}
							else if(_s == 0)
							{
								printf("client is quit...\n");
								close(gfd[k]);
								gfd[k] = -1;
							}
							else
							{
								perror("read");
							}

						}
					}
				}
				break;
		}

	}
	return 0;
}