码迷,mamicode.com
首页 > 其他好文 > 详细

select

时间:2019-08-06 01:00:49      阅读:98      评论:0      收藏:0      [点我收藏+]

标签:ohs   amp   pre   soc   max   top   并发服务器   最大   tpi   

一。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

标签:ohs   amp   pre   soc   max   top   并发服务器   最大   tpi   

原文地址:https://www.cnblogs.com/sclu/p/11306251.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!