/*通过poll函数循环监视套结字*/ int poll_server (int *sock_fd) { int server_recv_return = 0 ; int n ; int poll_num = 0 ; /*记录poll函数返回 发生事件的套结字的个数*/ int count = 0 ; /*需要监视的套结字个数*/ struct pollfd poll_fd[POLLMAX] ; /*监视列表数组*/ struct pollfd *poll_fd_temp ; memset (&poll_fd[0], 0, POLLMAX*sizeof (struct pollfd)) ; /*监视列表数组全部清0*/ /*将侦听套结字存入poll_fd[0]元素中,监听事件为有普通可读数据就绪*/ poll_fd[0].fd = *sock_fd ; poll_fd[0].events = POLLRDNORM ; count = 1 ; /*循环监视事件*/ while((poll_num = poll (&poll_fd[0], count, -1)) >= 0) {printf ("start deal\n") ; if(poll_fd[0].revents == POLLRDNORM) { /*侦听套结字上有可读数据时,说明有客户端请求连接*/ /*从监视列表中寻找第一个未使用的元素*/ if((poll_fd_temp = poll_get (&poll_fd[0])) == NULL) { printf ("too many client\n") ; break ; } if(server_accept (&poll_fd[0].fd, poll_fd_temp) < 0) { break ; } count++ ; } /*将整个监视列表查看一遍,对发生事件的套结字进行处理*/ for(n = 1; n < POLLMAX; n++) { if(poll_fd[n].revents == POLLRDNORM) { /*接收命令包*/ if((server_recv_return = server_recv (&poll_fd[n])) < 0) { continue ; } /*如果该套结字断开连接,将poll_fd数组中该元素清空*/ else if(server_recv_return == 1) { memset (&poll_fd[n], 0, sizeof (struct pollfd)) ; printf ("a client gone\n") ; } else { poll_fd[n].revents = 0 ; /*重新将发生的事件置为0,以便下一次监视*/ } poll_num-- ; } if(poll_num <= 0) { /*发生事件的套结字处理完,直接退出循环*/ break ; } } printf ("deal end\n") ; } return 0 ; }
lagopus_qmuxer_poll_t ofp_bridgeq_mgr_dataq_poll_get(struct ofp_bridgeq *bridgeq) { return poll_get(bridgeq, DATAQ_POLL); }
lagopus_qmuxer_poll_t ofp_bridgeq_mgr_event_dataq_dp_poll_get(struct ofp_bridgeq *bridgeq) { return poll_get(bridgeq, EVENT_DATAQ_DP_POLL); }
lagopus_qmuxer_poll_t ofp_bridgeq_mgr_eventq_poll_get(struct ofp_bridgeq *bridgeq) { return poll_get(bridgeq, EVENTQ_POLL); }