• 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 已经连接
    ",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
    ",buf);
    					write(i,buf,len);
    				}
    
    			}
    		}
    
    	}
    }
    

      

  • 相关阅读:
    Flask_之使用过程中出现的异常
    GO-学习之golang 自动下载所有依赖包
    数据库-Oracle如何将clob数据以字符串打印出来
    数据库-Oracle条件判断语句
    python框架Django汇总
    每日一模块_os及subprocess模块【执行系统命令】
    每日一模块-sftp的使用
    python并发编程-队列MQ的学习
    python高效配置-响应code枚举类设计
    git-使用大全
  • 原文地址:https://www.cnblogs.com/sclu/p/11306251.html
Copyright © 2020-2023  润新知