I/O多重(select)

2732 ワード

I/O多重化(select):1つのプロセスまたは1つのスレッドが同時に複数のファイル記述子にサービスを提供できる
1、TCPサーバー設定socket bind listen 2、socketをfdsに追加する3、whileサイクルを起動する3.1 fdsの文教記述子をfdsetセットに追加3.2 select 3.3サイクルを起動してどのファイル記述子が準備できているか3.3.1 sockfdクライアントが3回握手accept fds_を完了したadd(新しく生成されたファイル記述子を追加)3.3.2リンクfdsクライアントは、受信データ1、<=0 close(fds[i])にデータが到達し、fds_del 2、>0処理データ
#include
#include
#include
#include
#include
#include
#include
#include
#include

#define MAXFD 10



void fds_init(int fds[])
{
	int i=0;
	for(;imaxfd)
				{
				
					maxfd=fds[i];//        maxfd                
				}
		}
		
		
		
		struct timeval tv={5,0};
		int n=select(maxfd+1,&fdset,NULL,NULL,&tv);//           ,       +1,                       
		if(n==-1)
		{
			perror("select error");
			continue;
		}
		
		
		
		else if(n==0)
		{
			printf("time out
"); continue; } else { int i=0; for(;i<=MAXFD;i++) { if(fds[i]==-1)// { contiune; } if(FD_ISSET(fds[i],&fdset))// { if(fds[i]==sockfd)// { //struct sockaddr_in caddr; int len=sizeof(caddr); int c=accept(sockfd,(struct sockaddr*)&caddr,&len); if(c<0)// { continue; } fds_add(fds,c);// , printf("accept c=%d
",c); } else// { char buff[128]={0}; int num=recv(fds[i],buff,127,0);// if(num<=0)// { close(fds[i]); fds_del(fds,fds[i]);// fds[i] printf("one client over
"); } else { printf("read(%d):%s
",fds[i],buff); send(fds[i],"ok",2,0); } } } } } } }
int select(int nfds,fd_set *readfs,fd_set*writefds,fd_set*exceptfds,struct timeval*timeout)



nfds:            

readfds:                  


writefds:            


execptfds:          


timeout:           timeoutw NULL select    

   :>0            

       ==0  

       ==-1