转自:http://blog.ednchina.com/thinkker/151596/message.aspx
select函数:
系统提供select函数来实现多路复用输入/输出模型。原型:
#include <sys/time.h>
#include <unistd.h>
select函数:
系统提供select函数来实现多路复用输入/输出模型。原型:
#include <sys/time.h>
#include <unistd.h>
int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout);
参数maxfd是需要监视的最大的文件描述符值+1;rdset,wrset,exset分别对应于需要检测的可读文件描述符的集合,可写文件描述符的集合及异常文件描述符的集合。struct timeval结构用于描述一段时间长度,如果在这个时间内,需要监视的描述符没有事件发生则函数返回,返回值为0。
FD_ZERO,FD_SET,FD_CLR,FD_ISSET: 参数maxfd是需要监视的最大的文件描述符值+1;rdset,wrset,exset分别对应于需要检测的可读文件描述符的集合,可写文件描述符的集合及异常文件描述符的集合。struct timeval结构用于描述一段时间长度,如果在这个时间内,需要监视的描述符没有事件发生则函数返回,返回值为0。
FD_ZERO,FD_SET,FD_CLR,FD_ISSET:
FD_ZERO(fd_set *fdset);将指定的文件描述符集清空,在对文件描述符集合进行设置前,必须对其进行初始化,如果不清空,由于在系统分配内存空间后,通常并不作清空处理,所以结果是不可知的。
FD_SET(fd_set *fdset);用于在文件描述符集合中增加一个新的文件描述符。
FD_CLR(fd_set *fdset);用于在文件描述符集合中删除一个文件描述符。
FD_ISSET(int fd,fd_set *fdset);用于测试指定的文件描述符是否在该集合中。
struct timeval结构:
struct timeval{
long tv_sec;//second
long tv_usec;//minisecond
}
timeout设置情况:
null:select将一直被阻塞,直到某个文件描述符上发生了事件。
0:仅检测描述符集合的状态,然后立即返回,并不等待外部事件的发生。
特定的时间值:如果在指定的时间段里没有事件发生,select将超时返回。
一个实例:
#include <stdlib.h>
#include <stdio.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <string.h>
#define PORT 3333
#define MAX 10
main()
{
int t,r,c,i,j,temp;
int ch[MAX];
fd_set c1;
//struct timeval time;
struct sockaddr_in server,client;
socklen_t len=sizeof(client);
if((t=socket(AF_INET,SOCK_STREAM,0))==-1) {perror("socket");exit(1);}
server.sin_family=AF_INET;
server.sin_port=htons(PORT);
server.sin_addr.s_addr=inet_addr("192.168.0.164");
bzero(&server.sin_zero,sizeof(server.sin_zero));
if(bind(t,(struct sockaddr *)&server,sizeof(struct sockaddr))==-1) {perror("bind");exit(1);}
if(listen(t,20)==-1) {perror("listen");exit(1);}
FD_ZERO(&c1);FD_SET(t,&c1);
while(1)
{
//time.tv_sec=0;
//time.tv_usec=0;
if(select(t+1,&c1,NULL,NULL,(struct timeval *)0)>0)
{
if(FD_ISSET(t,&c1)>0)
{
if((c=accept(t,(struct sockaddr *)&client,&len))==-1) {perror("accept");exit(1);}
if(recv(c,ch,sizeof(int)*MAX,0)==-1) {perror("recv");exit(1);}
for(i=0;i<9;i++)
for(j=i+1;j<10;j++)
if(ch[i]>ch[j]) {temp=ch[i];ch[i]=ch[j];ch[j]=temp;}
if(send(c,ch,sizeof(int)*MAX,0)==-1) {perror("send");exit(1);}
}
else perror("FD_ISSET");
close(c);
}
else perror("select");
}
}
client端代码
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <string.h>
#define MAX 10
main()
{
struct sockaddr_in client,server;
int a,s,i;
int c[MAX],x[MAX];
printf("请输入要排序的数字/n");
for(i=0;i<MAX;i++)
scanf("%d",&c[i]);
if((s=socket(AF_INET,SOCK_STREAM,0))==-1) {perror("socket");exit(1);}
client.sin_family=AF_INET;
client.sin_port=htons(0);
client.sin_addr.s_addr=INADDR_ANY;
bzero(&(client.sin_zero),sizeof(client.sin_zero));
server.sin_family=AF_INET;
server.sin_port=htons(3333);
inet_aton("192.168.0.164",&(server.sin_addr.s_addr));
bzero(&(server.sin_zero),sizeof(server.sin_zero));
if(bind(s,(struct sockaddr *)&client,sizeof(client))==-1) {perror("bind");exit(1);}
if(connect(s,(struct sockaddr *)&server,sizeof(struct sockaddr))==-1) {perror("connect");exit(1);}
if(send(s,c,sizeof(int)*MAX,0)==-1) {perror("send");exit(1);}
if(recv(s,x,sizeof(int)*MAX,0)==-1) {perror("recv");exit(1);}
printf("原值是:/n");
for(a=0;a<MAX;a++)
printf("%d",c[a]);
printf("/n");
printf("排序完:/n");
for(a=0;a<MAX;a++)
printf("%d",x[a]);
printf("/n");
close(s);
}
本篇文章来源于 Linux公社网站(www.linuxidc.com) 原文链接:http://www.linuxidc.com/Linux/2008-12/17794.htm