使用select进行server编程 fd_set 类型占128个字节,每个字节8位,8*128=1024;所提fd_set有1024个标志位,select可以对1024个fd进行检测。 如果client向server发起连接请求,会向server发一个SYN,select可以检测到。 如果已连接的client向server发送了数据,select也能检测到。
流程如下: int lfd = scoket创建好 lfd绑定ip和端口 listen(); 初始化监听文件描述符,将监听l的fd加入fd_set fd_set reads; fd_set(lfd,&reads); int max_fd=lfd; //死循环,不停地对reads监听 while(1){ fd_set tem=reads; int num=select(…);select可以设置为永久阻塞,只有当检测到有通信(发起SYN请求或发送数据)时才返回。同时,检测到的fd在fd_set(reads)中被置1,没有通信的fd被置0。 if(FD_ISSET(lfd, &tem)){ //说明有连接请求 int c_fd = accept(); //同时把c_fd加入fd_set被检测 FD_SET(c_fd,&reads); maxfd=max(maxfd,c_fd); } for(int i=lfd+1;i<=maxfd;i++){ //对所有的fd判断是否有数据发送过来 if(FD_ISSET(i,&tem)){ //执行业务逻辑 //如果关闭了与client通信,还应该将其从fd_set取消,关闭通信了,这个文件描述符就不需要在被监听了,然后再关闭。 FD_CLR(i,&reads); close(i); } } close(lfd); }