为什么这样用select,筛选式使用FD_ISSET 不行?

来源:互联网 发布:算法工程师要求 编辑:程序博客网 时间:2024/05/17 23:49

 

#include <stdio.h>#include <sys/socket.h>#include <stdlib.h>#include <netinet/in.h>#include <string.h>#include <unistd.h>#include <arpa/inet.h>#include <errno.h>#define N 64typedef struct sockaddr SA;int main(int argc,char *argv[]){int listenfd,connfd[16],i = 0,maxfd;int n;struct sockaddr_in  myaddr,peeraddr,connaddr;socklen_t peerlen = sizeof(connaddr),connlen = peerlen; char buf[N];fd_set readfd,fdsetbak;bzero(connfd,sizeof(connfd));//if(argc < 3)//{//printf("Usage: %s <IP> <Port>\n",argv[0]);//exit(-1);//}if((listenfd = socket(PF_INET,SOCK_STREAM,0)) < 0){perror("socket error");exit(-1);}bzero(&myaddr, sizeof(myaddr));myaddr.sin_family = PF_INET;myaddr.sin_port = htons(atoi("9090"));myaddr.sin_addr.s_addr = inet_addr("192.168.0.103");//myaddr.sin_port = htons(atoi(argv[2]));//myaddr.sin_addr.s_addr = inet_addr(argv[1]);if(bind(listenfd, (SA *)&myaddr, sizeof(myaddr)) < 0){perror("fail to bind");exit(-1);}if(listen(listenfd, 16) < 0){perror("fail to listen");exit(-1);}FD_ZERO(&readfd);FD_SET(listenfd,&readfd);maxfd = listenfd;fdsetbak = readfd;while(1){readfd = fdsetbak;if(select(maxfd+1, &readfd, NULL,NULL,NULL) < 0){perror("fail to select");exit(-3);}if(FD_ISSET(listenfd,&readfd)){i = 0;while(connfd[i]){i++;if(i>=16) break;// chao chu 16;}if((connfd[i] =accept(listenfd,(SA *)&peeraddr,&peerlen)) < 0){perror("fail to accept");i = 0;exit(-2);}FD_SET(connfd[i],&readfd);fdsetbak = readfd;maxfd = maxfd>connfd[i] ? maxfd:connfd[i];getsockname(connfd[i],(SA *)&connaddr,&connlen);printf("new connect from [%s:%d]to[%s:%d]\n",inet_ntoa(peeraddr.sin_addr),ntohs(peeraddr.sin_port),inet_ntoa(connaddr.sin_addr),ntohs(connaddr.sin_port));}else{for(i = 0;i<16;i++){if(connfd[i]){if(FD_ISSET(connfd[i],&readfd)){if((n = recv(connfd[i],buf,N,0)) <=0){getpeername(connfd[i],(SA *)&peeraddr,&peerlen);printf("[%s:%d] closed\n",inet_ntoa(peeraddr.sin_addr),ntohs(peeraddr.sin_port));FD_CLR(connfd[i],&fdsetbak );readfd = fdsetbak; close(connfd[i]);connfd[i] = 0;}else{printf("send to %d\n",connfd[i]);send(connfd[i],buf,n,0);}}}}}}return 0;}


 

筛选式的使用FD_ISSET不行吗?

非要

for(i=0;i<maxfd+1;i++)

{

          FD_ISSET();

         {

          }

}

 

才行吗?