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処理データ
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