2016-07-07 55 views
1

現有程序是這樣寫爲UDP套接字(在阻塞模式下):如果有數據沒有從最後一次讀取()讀取,poll()會立即返回UDP套接字?

while (true) { 
    poll(); 
    if (POLLIN is set) { 
     read(fd, buf, bufSize); 
    } 
} 

對於UDP,每個讀()讀取1和僅1個數據報(數據包)。如果套接字recv buf中有多個可用的數據包,則上面的代碼僅在每次讀取()時讀取1個數據包。我的問題是:下一個poll()會立即返回,因此上面的代碼仍然可以很快從套接字讀取?或者可能下一次poll()等待,直到有新的數據包到達套接字,因此代碼有效地落後於閱讀?

該文檔似乎表明,只要緩衝區中有數據,下一個poll()就會立即返回。但代碼似乎落後於閱讀,我不知道原因是在上面的代碼或其他地方。

的首選方法是可能的:

set the socket to non blocking 
read in the loop until errno = EWOULDBLOCK or EAGAIN 

感謝。

回答

2

如果poll()被調用時,如果套接字緩衝區中已經有數據,如果請求POLLIN,那麼它應該立即通知POLLIN,是的。在發出信號POLLIN之前,它不應該等待下一個數據包到達緩衝區。

相關問題