select

Posted sclu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了select相关的知识,希望对你有一定的参考价值。

一。select函数原型

技术图片

 

二。select实现并发服务器

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<arpa/inet.h>
#include<ctype.h>
#include<strings.h>
#include<sys/wait.h>
#include<sys/select.h>
#include<string.h>
#define SERV_PORT 8888
#define SERV_IP "192.168.0.109"

void wait_child(int sign)

	while(waitpid(0,NULL,WNOHANG)>0);
	return ;

int main()

	pid_t pid;
	int lfd,cfd;
	char buf[BUFSIZ];
	lfd=socket(AF_INET,SOCK_STREAM,0);

	struct sockaddr_in serv_addr,clie_addr;
	socklen_t clie_addr_len;
	clie_addr_len=sizeof(clie_addr);

	bzero(&serv_addr,sizeof(serv_addr));
	serv_addr.sin_family=AF_INET;
	serv_addr.sin_port=htons(SERV_PORT);

	//serv_addr.sin_addr.s_addr=htonol(INADDR_ANY); 使用可用的ip
	//指定ip  用inet_pton转换
	inet_pton(AF_INET,SERV_IP,&serv_addr.sin_addr.s_addr);
	bind(lfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr));

	listen(lfd,128);

	//最大的文件描述符
	int maxfd=lfd;
	//读集合
	fd_set reads,temp;
	FD_ZERO(&reads);
	FD_SET(lfd,&reads);

	while(1)
	

		temp=reads;
		//委托内核做IO检测
		int ret=select(maxfd+1,&temp,NULL,NULL,NULL);
		if(ret==-1)
		
			perror("select err");
			exit(1);
		
		//客户端发起了新连接
		if(FD_ISSET(lfd,&temp))
		
			//接收连接请求
			int cfd=accept(lfd,(struct sockaddr*)&clie_addr,&clie_addr_len);
			if(cfd==-1)
			
				perror("accept err");
				exit(1);
			
			char buf_ip[BUFSIZ];
			printf("ip:%s,port:%d 已经连接\\n",inet_ntop(AF_INET,&clie_addr.sin_addr.s_addr,buf_ip,sizeof(buf_ip)),ntohs(clie_addr.sin_port));
			//将cfd加入读集合
			FD_SET(cfd,&reads);
			//更新最大的文件描述符
			maxfd=maxfd<cfd?cfd:maxfd;
		
		//已经连接的客户端有数据到达
		for(int i=lfd+1;i<=maxfd;i++)
		
			memset(buf,0,sizeof(buf));
			if(FD_ISSET(i,&temp))
			
			//	char buf[BUFSIZ];
				int len=read(i,buf,sizeof(buf));
				if(len==-1)
				
					perror("recv error");
					exit(1);
				else if(len==0)
					//					printf("ip:%s,port:%d 关闭连接",inet_ntop(AF_INET,&clie_addr.sin_addr.s_addr,buf_ip,sizeof(buf_ip)),ntohs(clie_addr.sin_port));
					close(i);					
					FD_CLR(i,&reads);
				else
					printf("read buf:%s\\n",buf);
					write(i,buf,len);
				

			
		

	

  

 

以上是关于select的主要内容,如果未能解决你的问题,请参考以下文章

Oracle系列七 子查询

sql之子查询

binglinuxc(多路转接)

binglinuxc(多路转接)

binglinuxc(多路转接)

Oracle_071_lesson_p8