Example #1
0
/*通过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 ;
}
Example #2
0
lagopus_qmuxer_poll_t
ofp_bridgeq_mgr_dataq_poll_get(struct ofp_bridgeq *bridgeq) {
  return poll_get(bridgeq, DATAQ_POLL);
}
Example #3
0
lagopus_qmuxer_poll_t
ofp_bridgeq_mgr_event_dataq_dp_poll_get(struct ofp_bridgeq *bridgeq) {
  return poll_get(bridgeq, EVENT_DATAQ_DP_POLL);
}
Example #4
0
lagopus_qmuxer_poll_t
ofp_bridgeq_mgr_eventq_poll_get(struct ofp_bridgeq *bridgeq) {
  return poll_get(bridgeq, EVENTQ_POLL);
}