서버 select 모델

다중 연결 I/O 서버 중 하나: select 서버, 이 모델의 서버는 파일 설명자를 대기열에 저장하고 감청하며, 이 파일 설명자를 윤문 메커니즘으로 감청하며, 해당하는 파일 설명자가 읽기 요청, 쓰기 상황 또는 이상이 발생하면 대응하는 위치가 변경됩니다.select모델은 모든 감청된 플러그인에 대해 윤문감청 처리를 실시해야 하며, 감청해야 하는 플러그인이 너무 많으면 응답이 제때에 이루어지지 않는 등 문제가 발생하여 서버 성능을 떨어뜨릴 수 있다.
다음은 서버의 실현 (서버가 클라이언트가 보낸 데이터를 모두 대문자로 변환)
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main(int argc, char const *argv[])
{
	// 
	int listen_fd=socket(AF_INET,SOCK_STREAM,0);
	if(-1==listen_fd)
	{
		perror("socket");
		return ;
	}
	// 
	struct sockaddr_in seraddr;
	memset(&seraddr,0,sizeof(seraddr));
	seraddr.sin_family=AF_INET;
	seraddr.sin_port=htons(1234);
	seraddr.sin_addr.s_addr=inet_addr("192.168.1.30");
	// 
	if(bind(listen_fd,(struct sockaddr*)&seraddr,sizeof(seraddr))==-1)
	{
		perror("bind");
		return ;
	}
	// 
	if(listen(listen_fd,10)==-1)
	{
		perror("listen");
		return ;
	}
	int maxfd=listen_fd;
	fd_set readset;
	struct timeval ts;
	ts.tv_sec=1;
	int clifd[128];
	int i,index=0;
	for(i=0;i<128;i++)
	{
		clifd[i]=-1;
	}

	while(1)
	{
		FD_ZERO(&readset);// 
		FD_SET(listen_fd,&readset);// listen_fd 
		for(i=0;i0)
		{
			// 
			if(FD_ISSET(listen_fd,&readset))
			{
				struct sockaddr_in cliaddr;
				memset(&cliaddr,0,sizeof(cliaddr));
				int cli_size=sizeof(cliaddr);
				int fd=accept(listen_fd,(struct sockaddr*)&cliaddr,&cli_size);
				if(-1==fd)
				{
					perror("accept");
					return ;
				}
				clifd[index]=fd;
				if(clifd[index]>maxfd)
				{
					maxfd=clifd[index];
				}
				index++;
				printf("index:%d
",index); } for(i=0;i='a' && buf[j]<='z') { buf[j] -= 0x20; } j++; } write(clifd[i],buf,strlen(buf)); } } } } return 0; }

좋은 웹페이지 즐겨찾기