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的主要内容,如果未能解决你的问题,请参考以下文章