1 #define POLL_FD_SIZE 1024 2 int doServicePoll(int listenFd) 3 { 4 struct sockaddr_in cliAddr; 5 socklen_t len; 6 7 int i; 8 struct pollfd pollFdSet[POLL_FD_SIZE]; 9 for(i = 0 ; i < POLL_FD_SIZE; i++) { 10 pollFdSet[i].fd = -1; 11 } 12 pollFdSet[0].fd = listenFd; 13 pollFdSet[0].events = POLLIN; 14 15 int pollRet; 16 int fdNum = 1; 17 18 int acceptFd; 19 int readNum; 20 while(1) { 21 pollRet = poll(pollFdSet, fdNum, 10); 22 if(pollRet < 0) { 23 if(errno == EINTR) continue; 24 ERR_EXIT("poll"); 25 } else if(pollRet == 0) { 26 continue; 27 } 28 29 if(pollFdSet[0].revents & POLLIN) { //注意点 是& 而不是== 30 memset(&cliAddr, 0, sizeof(cliAddr)); 31 len = sizeof(cliAddr); 32 if((acceptFd = accept(pollFdSet[0].fd, (struct sockaddr *)&cliAddr, &len)) < 0) { 33 ERR_EXIT("accept"); 34 } 35 for(i = 1; i < (POLL_FD_SIZE -1); i++) { 36 if(pollFdSet[i].fd == -1) { 37 pollFdSet[i].fd = acceptFd; 38 pollFdSet[i].events = POLLIN; 39 if(i > fdNum) { 40 fdNum = i; 41 } 42 } 43 } 44 if(i == POLL_FD_SIZE -1) { 45 ERR_EXIT("too many clients!"); 46 } 47 if(--pollRet == 0) continue; 48 } 49 50 for(i = 1; i < (POLL_FD_SIZE -1); i++) { 51 if(pollFdSet[i].fd == -1) { 52 continue; 53 } 54 if(pollFdSet[i].revents & POLLIN) { //注意点 是& 而不是== 55 readNum = handleRead(pollFdSet[i].fd); 56 if(readNum == READ_ERROR) { 57 ERR_EXIT("handleRead"); 58 } else if(readNum == READ_CLOSE) { 59 close(pollFdSet[i].fd); 60 printf("client closed, remove %d\n", i); 61 pollFdSet[i].fd = -1; 62 if(i == fdNum) { 63 fdNum--; 64 } 65 } 66 if(--pollRet == 0) { 67 break; 68 } 69 } 70 } 71 } 72 }
注意点:
1 pollFdSet[i].fd == -1 是判断是否需要监听的条件。
2 fdNum是表示监听描述符的个数。
3 判断是否可读 是通过 pollFdSet[i].revents & POLLIN 是否为真来表示的,其他可写等亦如此。
原文:http://www.cnblogs.com/superPerfect/p/3604135.html