2011-06-19 13 views
1

與監聽套接字打交道是從man epoll頁:通過以下所有epoll的

功能do_use_fd()使用新的 準備文件描述符 直到EAGAIN由要麼讀返回(2)或write(2) 。爲ET

代碼示例觸發

for(;;) { 
     nfds = epoll_wait(kdpfd, events, maxevents, -1); 

     for(n = 0; n < nfds; ++n) { 
      if(events[n].data.fd == listener) { 
       client = accept(listener, (struct sockaddr *) &local, 
           &addrlen); 
       if(client < 0){ 
        perror("accept"); 
        continue; 
       } 
       setnonblocking(client); 
       ev.events = EPOLLIN | EPOLLET; 
       ev.events = EPOLLIN | EPOLLET; 
       ev.data.fd = client; 
       if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, client, &ev) < 0) { 
        fprintf(stderr, "epoll set insertion error: fd=%d\n", 
          client); 
        return -1; 
       } 
      } 
      else 
       do_use_fd(events[n].data.fd); 
     } 
    } 

所以對於read/write操作,我們應該循環,直到一個EAGAIN收到做到這一點,但爲什麼它不是accept的情況?

IMO上面的代碼會錯過一些申請時有很多種客戶端套接字等待被接受,因爲它僅接受客戶端套接字,我們也應該把它包在一個循環,直到收到EAGAIN

或者是否有我失蹤的東西?

回答

4

看監聽套接字是如何加入到epollfd

ev.events = EPOLLIN;  // this is the crucial bit 
ev.data.fd = listen_sock; 

它不是在邊沿觸發,它在加入真實更高級別的觸發。所以不需要循環,直到EAGAIN

+0

@mat,如果在ET模式('| EPOLLET')中將'listen_sock'添加到epollfd中,你將如何處理它?我上面的代碼是錯的,對吧? –

+0

手冊頁中的代碼是正確的,因爲它不會在偵聽器套接字上設置ET模式。如果您在ET模式下添加監聽器,那麼您需要採取額外的預防措施並循環,直到EAGAIN。雖然要小心飢餓。 – Mat

+0

@Mat,就是從'man epoll'頁面引用'listen_sock'的上述代碼嗎? –

相關問題