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);
				}

			}
		}

	}
}

  

 

posted @ 2019-08-05 23:06  荼离伤花  阅读(376)  评论(0)    收藏  举报