// I/O复用服务器模型
//select编程
/***********************************
**** 版本:
**** 编写
**** 修改
***********************************/
程序流程
#include <sys/select.h>
/* According to earlier standards */
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/socket.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <linux/in.h>
#include <strings.h>
#define N 80
int main(void)
{
int sokfid=0;
int i;
fd_set readfds;
fd_set readfdstemp;
int listenfd;
int clienfd;
int select_nu;
char buf[100];
struct sockaddr_in sever_in;
struct sockaddr_in clien_in;
int iaddrlen=sizeof(sever_in);
/******设置服务的socket sever_in *******/
bzero(&sever_in,sizeof(sever_in));
sever_in.sin_family=AF_INET;
sever_in.sin_port=htons(9000);
sever_in.sin_addr.s_addr=inet_addr("192.168.1.100");
/*****创建套接字***********************/
if((sokfid=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("creat sockt");
exit(-1);
}
/*****绑定套接字***********************/
if(bind(sokfid,(struct sockaddr*)&sever_in,sizeof(sever_in))<0)
{
perror("bind:");
exit(-1);
}
/*****建立监听队列***********************/
listen(sokfid,5);
/*****初始化读select集合****************/
FD_ZERO(&readfds);
/*****把套接字放入监控集合中*************/
FD_SET(sokfid,&readfds);
/**********扫描上限设置**************************** /
select_nu=sokfid+1;
while(1)
{
FD_SET(sokfid,&readfds);
/*********设置临时监听集合**********************/
readfdstemp=readfds;
/*********启用select扫描集合中的就绪项**********/
/**************************************************
*** select 为阻塞函数
*** select 把就绪项标志设为1,把非就绪项标志清零
*** 利用临时的 集合readfdstemp很有必要
****************************************************/
if(select(select_nu,&readfdstemp,NULL,NULL,NULL)>0)
{
}
for(i=0;i<select_nu;i++)
{
if(FD_ISSET(i,&readfdstemp))
{
/********如果就绪队列socket链接活动那么就启动链接*************/
if(i==sokfid)
{
clienfd=accept(sokfid,(struct sockaddr*)&clien_in,&iaddrlen);
FD_SET(clienfd,&readfds);
select_nu=clienfd+1;
printf("%d\n",clienfd);
}
/***********如果服务器端的接受到客户端的信息就原样返回***********/
else
{
int n;
bzero(buf, sizeof(buf));
n = recv(i, buf, N, 0);
if (n == 0)
{
FD_CLR(i,&readfds);
select_nu--;
close(i);
break;
}
buf[n] = 0;
printf("n = %d: %s\n", n, buf);
send(i, buf, n, 0);
printf("the end....\n");
}
}
}
}
}