zoukankan      html  css  js  c++  java
  • 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);
    				}
    
    			}
    		}
    
    	}
    }
    

      

  • 相关阅读:
    Layui的省市区三级联动
    Uncaught SyntaxError: Unexpected token ','
    Cannot use 'in' operator to search for '23' in
    Linux 递归批量删除文件夹或文件的命令
    PHPstorm常用快捷键(Windows)
    Isset、empty、count、is_null的比较
    PHPstorm快捷键的学习
    Elasticsearch索引按月划分以及获取所有索引数据
    Elasticsearch入门
    java自学-流程控制语句
  • 原文地址:https://www.cnblogs.com/sclu/p/11306251.html
Copyright © 2011-2022 走看看