多路复用之poll

//下面是用到poll()---
其原型是:int poll(struct pllfd *fds,unsigned int nfds,int timeout);
该函数的功能类似select;
参数一:是一个结构体指针,这里可以用结构体数组;该结构体包含了文件描述


符,对应的事件,发生了就返回其事件
参数二:第一个参数结构体成员的个数
参数三:超时时间(以毫秒为单位)
 
 #include <stdio.h>
  2 
  3 #include <sys/time.h>
  4 #include <sys/types.h>
  5 #include <unistd.h>
  6 #include <fcntl.h>
  7 
  8 #include <sys/types.h>          /* See NOTES */
  9 #include <sys/socket.h>
 10 #include <netinet/in.h>
 11 #include <arpa/inet.h>
 12 
 13 #include <poll.h>
 14 
 15 #include <string.h>
 17 #define PORT    6543
 18 
 19 int main()
 20 {
 21         /*创建套接字,用于连接*/
 22         int s = socket(AF_INET, SOCK_STREAM, 0);
 23         if(0 > s){
 24                 perror("socket");
 25                 return -1;
 26         }
 27 
 28         /*端口重用*/
 29         int reuseaddr = 1;
 30         if(0 > setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &reuseaddr, 


sizeof(re    useaddr))){
 31                 perror("setsockopt");
 32                 return -1;
 33         }
 34 
 35         /*绑定server IP及端口号*/
 36         struct sockaddr_in addr;
 37         memset(&addr, 0, sizeof(struct sockaddr_in));
 38         addr.sin_family = AF_INET;
 39         addr.sin_port = htons(PORT);
 40         addr.sin_addr.s_addr = htonl(INADDR_ANY);
 41 
 42         socklen_t addrlen = sizeof(struct sockaddr_in);
 43         if(0 > bind(s, (struct sockaddr *)&addr, addrlen)){
 44                 perror("bind");
 45                 return -1;
 46         }
 47 
 48         /*设置监听数*/
 49         listen(s, 10);
 50 
 51         /*设置套接字为非阻塞*/
 52         int val = fcntl(s, F_GETFL, 0);
 53         val |= O_NONBLOCK;
 54         fcntl(s, F_SETFL, val);
 55 
 56         /*初始化读集合*/
 57         #define MAXSET 12
 58         struct pollfd fdset[MAXSET];
 59         memset(fdset, 0, sizeof(fdset));
 60         fdset[0].fd = s;
 61         fdset[0].events= POLLIN;
 62 
 63         int i = 0;
 64         for(i = 1; i < MAXSET; i++){
65                 fdset[i].fd    = -1;
 66                 fdset[i].events= POLLIN;
 67         }
 68 
 69         printf("Wait for connecting .\n");
 70         while(1){
 71                 int ret = poll(fdset, MAXSET, -1);
 72                 if(0 > ret){
 73                         perror("poll");
 74                         return -1;
 75                 }else if(0 == ret){
 76                         printf("Timeout.\n");
 77                         continue;
 78                 }else{
 79                         /*测试用于连接的套接字,看是否有新连接进来


*/
 80                         if(POLLIN & fdset[0].revents){
 81                                 struct sockaddr_in newaddr;
 82                                 memset(&newaddr, 0, sizeof(struct 


sockaddr_i    n));
 83                                 socklen_t newlen = sizeof(struct 


sockaddr_in    );
 84                                 /*有新连接进来,得到用于读写到套接


字*/
85                                 int news = accept(s, (struct 


sockaddr *)&new    addr, &newlen);
 86                                 if(0 > news){
 87                                         perror("accept");
 88                                         return -1;
 89                                 }
 90                                 /*把套接字保存进集合*/
 91                                 if(news >= (MAXSET-3)){
 92                                         printf("No more 


connect.\n");
 93                                         close(news);
 94                                         continue;
 95                                 }
 96                                 fdset[news-3].fd = news;
 97                                 printf("New connect: SOCKET[%d], %


s:%d\n", n    ews, inet_ntoa(newaddr.sin_addr), ntohs


(newaddr.sin_port));
 98                         }
 99                         for(int i = 1; i < MAXSET; i++){
100                                 /*测试用于读写到套接字,看哪个客户


端发数据进
    来*/
101                                 if(POLLIN & fdset[i].revents){
102                                 #define MAX 64
103                                         char buf[MAX];
104                                         bzero(buf, MAX);
105                                         int num = recv(fdset[i].fd, 


buf, MAX    , 0);
106                                         if(0 >= num){
107                                                 close(fdset[i].fd);
108                                                 printf("SOCKET[%d] 


leave.\n"    , fdset[i].fd);
109                                                 fdset[i].fd = -1;
110                                                 continue;
111                                         }
112                                         printf("SOCKET[%d]: %s[%d]


\n", i, bu    f, num);
113                                 }
114                         }
115                 }
116         }
117 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值