首页 > 其他 > 详细

poll的使用

时间:2014-03-17 12:09:42      阅读:475      评论:0      收藏:0      [点我收藏+]
bubuko.com,布布扣
 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 }
bubuko.com,布布扣

注意点:

1   pollFdSet[i].fd == -1 是判断是否需要监听的条件。

2  fdNum是表示监听描述符的个数。

3  判断是否可读 是通过   pollFdSet[i].revents & POLLIN 是否为真来表示的,其他可写等亦如此。

poll的使用,布布扣,bubuko.com

poll的使用

原文:http://www.cnblogs.com/superPerfect/p/3604135.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!